在我的程序中,我需要使用dlopen()动态加载共享库。 程序和共享库都成功交叉编译为ARM体系结构,并在我的x86上安装了交叉编译器。 但是,每当程序尝试在ARM上运行时加载库时,它都会失败,并显示以下错误: 未定义的符号:_dl_hwcap 我找不到这个错误的罪魁祸首。 让我详细介绍如何在x86上构建共享库( libmyplugin.so )。 我使用g++交叉编译器如下: /home/me/arm/gcc-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -march=armv7-a -mfloat-abi=hard -c -s -fPIC -o build/module1.o module1.cpp /home/me/arm/gcc-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -march=armv7-a -mfloat-abi=hard -c -s -fPIC -o build/module2.o module2.cpp /home/me/arm/gcc-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -o dist/libmyplugin.so build/module1.o build/module2.o –sysroot /home/me/arm/sysroot/ -Wl,–no-as-needed -ldl -lX11 -lXext /home/me/arm/libstatic.a -shared -s -fPIC 请注意以下注意事项: module1.cpp和module2.cpp是我的源代码文件。 libstatic.a是一个大型的对象.o文件存档,它实现了module1.cpp和module2.cpp直接调用/引用的东西。 这些目标文件已由其他人编译为与我相同的ARM体系结构,具有相同的编译器标志,但使用稍微更新的g++编译器( v4.9而不是我的v4.8.3 )。 不幸的是,我无法控制这些物体的构建。 –sysroot /home/me/arm/sysroot/表示我的ARM OS的远程文件系统,本地g++交叉编译器在链接时可以从中获取本机库。 -Wl,–no-as-needed -ldl -lX11 […]
我正在寻找计算高度并行化的trig函数(在1024的块中),并且我想利用至少一些现代架构所具有的并行性。 当我编译一个块 for(int i=0; i<SIZE; i++) { arr[i]=sin((float)i/1024); } 海湾合作委员会不会对其进行矢量化,并表示 not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38); 这对我来说很有意义。 但是,我想知道是否有一个库可以进行并行三角计算。 只有一个简单的泰勒系列上升到11阶,GCC将矢量化所有循环,并且我的速度超过了一个天真的sin循环的速度的两倍(具有精确的答案,或者具有9阶系列,只有一个位)关闭1600个值的最后两个,加速> 3倍)。 我确定有人之前遇到过这样的问题,但是当我谷歌时,我发现没有提到任何库等。 A.是否已存在某些内容? B.如果没有,建议优化并行触发function? 编辑:我发现了以下库名为“SLEEF”: http ://shibatch.sourceforge.net/,在本文中描述并使用SIMD指令计算几个基本function。 它使用SSE和AVX特定代码,但我认为将其转换为标准C循环并不困难。
我正在尝试将文件导入Eclipse C项目并进行编译。 构建过程找不到本地头文件。 头文件位于src目录中。 如何在eclipse中编辑包含路径? 如果我手动完成,我可以在gcc中指定-I选项。 Building file: ../src/averaging.c Invoking: GCC C Compiler gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF”src/averaging.d” -MT”src/averaging.d” -o”src/averaging.o” “../src/averaging.c” ../src/averaging.c:2:23: fatal error: averaging.h: No such file or directory compilation terminated. make: *** [src/averaging.o] Error 1
我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址。 使用GDB显示的地址与我在代码中执行此操作时的地址不同: 确切代码: #include int main() { char buffer[20]; printf(“%p\n”, buffer); // 0xbffff320 return 0; } 但是,如果我这样做在gdb中: p &buffer 我得到: 0xbffff330 为什么会有差异,它会搞砸我的缓冲区溢出攻击? 我禁用了ALSR和堆栈防护。 谢谢。 编辑1:即使我单步执行gdb并遇到打印行,我也会得到0xbffff320作为地址 编辑2: 环境:在Windows 7上的虚拟框中运行Ubuntu Linux 9映像。 gdb版本:6.8-debian 使用GCC编译,如: gcc -g -fno-stack-protector filename.c立即执行: ./a.out地址打印:0xbffff320 然后在调试器中打开如下: gdb ./a.out然后输入b main然后run p &buffer 然后地址是0xbffff330 编辑3: 这是重现行为的gdb日志: $ gdb ./a.out b主要 跑 这里的p&buffer / *地址与我运行的可执行文件时显示的不同* / […]
似乎gcc 4.6.2删除了它认为从函数中未使用的代码。 test.c的 int main(void) { goto exit; handler: __asm__ __volatile__(“jmp 0x0”); exit: return 0; } main()拆卸 0x08048404 : push ebp 0x08048405 : mov ebp,esp 0x08048407 : nop # <– This is all whats left of my jmp. 0x08048408 : mov eax,0x0 0x0804840d : pop ebp 0x0804840e : ret 编译器选项 没有启用优化,只有gcc -m32 -o test test.c […]
我正在Linux 64bit下使用Eclipse CDT编写一个简单的C共享库。 代码对的rand()函数有一个引用它编译得很好但是在链接时报告来自链接器的以下错误: gcc -shared -o “libalg.so” ./sort.o /usr/bin/ld: ./sort.o: relocation R_X86_64_PC32 against undefined symbol `rand@@GLIBC_2.2.5′ can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value sort.o是从文件编译的目标文件。 libalg.so是目标共享库名称。 谁能解释为什么会这样? 谢谢。
我一直在查看一些配置文件,我已经看到两者都被使用(虽然在不同的架构上)。 如果你在linux盒子上使用gcc,那么将选项传递给链接器的两种语法之间有什么区别吗? 阅读gcc手册,就我所知,它们几乎完全相同。
我是操作系统编程的新手,我正在阅读一本书,它给出了一个简单的内核示例如下: main() { char *video_memory = 0xb8000; *video_memory = ‘X’; } 要编译这个名为kernel.c的文件,我在Windows 7下使用MinGW,如下所示: gcc -ffreestanding -c kernel.c -o kernel.o 这将创建目标文件kernel.o。 但是,以下命令不起作用。 ld -o kernel.bin -Ttext 0x1000 kernel.o –oformat binary 我收到以下错误: ld: cannot perform PE operations on non PE output file ‘kernel.bin’ 我无法解决问题。 请帮我。 谢谢 在罗斯的帮助下,我成功地跳到内核偏移。 但是,我无法从Kernel_entry.asm调用C函数。 此外,当我从我的kernel.bin中删除C函数并更改下面的代码时,屏幕上会显示三个奇怪的字符。 Kernel_entry.asm如下: [bits 32] ;[extern _start] mov ebx, MSG_KERNEL_ENTRY […]
使用任意精度算术(例如512位整数)时,有没有办法让GCC在不使用内联汇编的情况下使用ADC和类似指令? 乍一看GMP的源代码显示,它们只是为每个支持的平台提供了汇编实现。 这是我编写的测试代码,它从命令行添加两个128位数字并打印结果。 (受mini-gmp的add_n启发): #include #include #include int main (int argc, char **argv) { uint32_t a[4]; uint32_t b[4]; uint32_t c[4]; uint32_t carry = 0; for (int i = 0; i < 4; ++i) { a[i] = strtoul (argv[i+1], NULL, 16); b[i] = strtoul (argv[i+5], NULL, 16); } for (int i = 0; i < 4; […]
我目前正在使用GCC-5.3在我的机器上运行Linux Mint ,因为C11是默认包含的。 我开始为自己学习C只是为了好玩,当时GCC版本是4.8如果我没记错的话。 如果在下面的程序中使用带有-pedantic标志的GCC-4.8 ,任何方式: #include #include int main(void){ char *arr = “123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890”; size_t length = strlen(arr); printf(“Length of Arr = %zu\n”,length); } 在编译时,会收到以下警告: program.c: In function ‘main’: program.c:5:5: warning: string length ‘510’ is greater than the length ‘509’ ISO C90 compilers are required to support [-Woverlength-strings] char *arr = “123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890”; ^ program.c:7:5: warning: […]