6

我正在开发嵌入式 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,现在它可以构建,但是在加载时出现此错误。

我试图理解这个错误,但到目前为止,我对它的确切含义以及如何修复它一无所知。我知道由于某种原因找不到符号,但我不明白为什么或如何修复它。

4

1 回答 1

7

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

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

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

于 2012-10-12T16:25:20.450 回答