意外的重定位类型0x03

5
我试图运行一个编译了我的库的程序,但当我执行该程序时,出现以下错误:
./a.out 
./a.out: error while loading shared libraries: ../../lib-arm/libCustomLibrary.so: unexpected reloc type 0x03

只有在Release执行时才会出现这种情况,使用Debug执行时一切正常。

你认为问题可能出在哪里?

CustomLibrary库链接的参数如下:

-lSubLibrary -fPIC -Wl,-Bstatic -lboost_system -lboost_filesystem -lboost_thread -lpthread -Wl,-Bdynamic -lrt

我附上了我的库的lld unix库命令输出。
ldd ../../lib-arm/libCustomLibrary.so 
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0x76e5d000)
libSubLibrary.so => ../../lib-arm/libSubLibrary.so (0x76e2d000)
librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x76e10000)
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76d3e000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76ccd000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76ca5000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76b75000)
libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76b6a000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76b4b000)
/lib/ld-linux-armhf.so.3 (0x76f05000)

符号类型 R_ARM_REL32 应该不是问题,除非运行时链接加载器目前无法处理它。另请参见 arm: module: add support for R_ARM_REL32 relocations,这是一个未被应用于内核的补丁。我不确定它是否已经被应用。我还发现 -fPIC 不能解决问题;请参见 Crypto++ Issue 846,ARM and "unexpected reloc type 0x03" loading shared object)。 - jww
2个回答

6

2
谢谢!我发现我在静态链接-lpthread,我改成动态链接并从链接器中删除了-fPIC,现在它完美运行! - Alejandro Rosas
如果您需要查找符号,可以使用 objdump -R mylib.so | grep R_ARM_REL32 - user2859193

1

关于:

./a.out 
./a.out: error while loading shared libraries: ../../lib-arm/libCustomLibrary.so: unexpected reloc type 0x03

我认为您需要展示与 libCustomLibrary.so 相关的源代码。您可以通过以下方式查看导致问题的符号:

LD_DEBUG=all ./a.out

冗长的输出之后,最后提到的符号将是问题所在。例如,在共享对象中测试手写汇编语言Cryptogams SHA会导致以下结果:

10419:     relocation processing: /home/test/libcryptopp-8.3.0.so.8 (lazy)
10419:     symbol=CRYPTOGAMS_armcaps;  lookup in file=/home/test/libcryptopp.so.8 [0]
10419:     binding file /home/test/libcryptopp.so.8 [0]: normal symbol `CRYPTOGAMS_armcaps'
/home/test/: error while loading shared libraries: /home/test/libcryptopp.so.8: unexpected reloc type 0x03

所以我知道问题出在 CRYPTOGAMS_armcaps 符号上。你可以用 objdump -r 确认一下。 R_ARM_REL32 是符号类型 0x03

$ objdump -r sha1-armv4.o

sha1-armv4.o:     file format elf32-littlearm

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
000004d0 R_ARM_REL32       CRYPTOGAMS_armcaps

然后您可以返回源文件并修复符号问题。

此外,从Crypto++ Issue 846中,ARM和“意外的reloc类型0x03”加载共享对象,我知道这不像使用-fPIC那么简单。所有内容都是使用-fPIC构建的,但问题仍然出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接