R_PPC_REL24重定位超出范围

时间:2012-10-12 15:54:34

标签: python c gcc swig 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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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