【问题标题】:unexpected reloc type 0x03意外的重定位类型 0x03
【发布时间】:2016-02-02 03:02:45
【问题描述】:

我正在尝试执行使用我自己的库编译的程序,但是当我执行该程序时出现以下错误:

./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 library 命令输出。

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)

【问题讨论】:

标签: c++ g++ raspberry-pi shared-libraries


【解决方案1】:

来自https://lists.linaro.org/pipermail/linaro-toolchain/2012-November/002939.html:

重定位类型 3 是 R_ARM_REL32,它是静态重定位,不是 允许在共享对象中。你是如何创建共享库的?制作 确保您使用 -fPIC 编译所有进入其中的代码。

换句话说,您在链接程序时使用-fPIC,但在构建共享库时可能不会。

【讨论】:

  • 谢谢!我发现我正在静态链接-lpthread,我改为动态链接它并从链接器中删除了-fPIC,它工作得很好!
  • 如果需要查找符号可以使用objdump -R mylib.so | grep R_ARM_REL32
【解决方案2】:

关于:

./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(手写 asm)会导致:

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++ 第 846 期,ARM and "unexpected reloc type 0x03" loading shared object,我知道它不像使用 -fPIC 那么简单。一切都是用-fPIC 构建的,问题仍然浮出水面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2017-06-14
    • 1970-01-01
    • 2019-05-26
    • 2011-04-17
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多