求助,关于一个ld的问题
powerpc平台Linux (none) 2.6.18.8
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main(void) handle = dlopen("./liberr.so", RTLD_NOW); dlerror(); dlclose(handle); |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
-fpic
如果支持这种目标机,编译器就生成位置无关目标码.适用于共享库(shared library).
-fPIC
如果支持这种目标机,编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围转移
这是GCC手册上关于这两个参数的说明,具体我也不太清楚
PIC代码的生成,貌似是gcc的问题而不是ld的问题
gcc manul上面有说
-fpic If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The 386 has no such limit.)
-fPIC If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.
关键在于GOT全局偏移量表里面的跳转项大小。
intel处理器应该是统一4字节,没有问题。
powerpc上由于汇编码或者机器码的特殊要求,所以跳转项分为短、长两种。
-fpic为了节约内存,在GOT里面预留了“短”长度。
而-fPIC则采用了更大的跳转项。
具体什么情况我也不了解了。
不知道楼主懂不懂powerpc的汇编,讲解一下powerpc的跳转指令??
楼上正解,楼主的跳转已经超过了32M
加个-mlongcall 编译一下应该可以