Python R_PPC_REL24重新定位超出范围

Python R_PPC_REL24重新定位超出范围,python,c,gcc,swig,powerpc,Python,C,Gcc,Swig,Powerpc,我正在嵌入式powerpc(e500v2)平台上工作。我正在使用GCC4.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 我以前在使用这个库时遇到过困难,我正在从目标上的Python2.5迁

我正在嵌入式powerpc(e500v2)平台上工作。我正在使用GCC4.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
我以前在使用这个库时遇到过困难,我正在从目标上的Python2.5迁移到2.7。当我最初尝试编译这个库时,根据我使用的标志,我在编译时遇到了重定位错误或操作数超出范围错误。我切换到GCC4.6.3,现在它已经构建好了,但是在加载它时我遇到了这个错误


我试图理解这个错误,但到目前为止,我还不清楚它到底意味着什么以及如何修复它。我知道由于某种原因找不到符号,但我不明白为什么或者如何修复它。

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

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


检查
-fPIC
标志是否用于构建库,以及链接器是否也被通知正在构建共享对象(通常通过
-shared
-Bshared
)。

好的,谢谢我在其他地方看到了这一建议。有人告诉我这个库是用fPIC编译的,但很可能不是。不管怎样,在一个库是PIC还是PIC之后,还有什么可以告诉我的吗?或者我可以问的另一个问题是,如果我做readelf-r,我应该期望在一个共享对象中看到r_PPC_REL24吗?我看到很多。或者此列表是否包括非外部符号?PIC库不应将动态重定位应用于PIC和GOT区域之外的任何对象,所有这些重定位都应能够覆盖整个地址空间。
readelf
不带
-D
选项显示静态链接的信息——在最终链接传递之后,这些重定位已经被应用,除了那些指向丢失符号(已转换为动态重定位)的重定位。好吧,很难跟踪,因为我的项目有很多代码和第三方模块,但有一些代码是在没有-fPIC的情况下编译的。现在开始工作了,谢谢!对于遇到它的其他人,只需运行“readelf-D-r | greprPPCREL24”。如果它找到任何R_PPC_REL24 relocs,则有一些对象在编译时没有使用-fPIC。