R_PPC_REL24重定位超出范围

Eri*_*ert 4 c python swig gcc powerpc

我正在研究嵌入式powerpc(e500v2)平台.我正在使用gcc 4.6.3和eglibc 2.13进行交叉编译.有一个swig库可以在目标上编译和加载.当它在python中加载时,我在回溯中收到此错误:

ImportError: /opt/load/lib/libISSDcn.so: R_PPC_REL24 relocation at 0x0ddc99c0 for symbol `longjmp' out of range
Run Code Online (Sandbox Code Playgroud)

我以前在这个库中遇到过困难,我正在从目标的python 2.5迁移到2.7.当我最初尝试编译这个库时,我在编译时得到重定位错误或操作数超出范围错误,具体取决于我使用的标志.我切换到gcc 4.6.3现在它构建,但我加载时收到此错误.

我试图理解这个错误,但到目前为止,我对它究竟意味着什么以及如何修复它一无所知.我知道某个符号由于某种原因无法找到,但我不明白为什么,或者如何修复它.

Sim*_*ter 5

R_PPC_REL24重定位用于24位相对偏移.此类型的重定位不应出现在动态重定位表中(这些表用于可加载对象内的引用,而不是它们之间的引用,因为库可以加载到超过16 MiB的地址).

默认情况下,编译器会尽可能生成这些重定位,因为这比使用完整的32位地址的代码要小得多且速度快,但是对于动态链接,需要将完整地址用于外部可见符号和生成的PIC/GOT条目.

检查该-fPIC标志是否用于构建库,并且还通知链接器它正在构建共享对象(通常是via -shared-Bshared).

  • 好吧,很难追查,因为我的项目有很多代码和第三方模块,但是没有-fPIC编译代码.现在它的工作,谢谢!对于遇到它的任何其他人,只需运行'readelf -D -r | grep R_PPC_REL24'.如果它找到任何R_PPC_REL24重定位,则有一些对象在没有-fPIC的情况下被编译. (2认同)