有效的ARM可执行文件找不到库

时间:2016-01-10 17:12:34

标签: c++ arm cross-compiling libraries dd-wrt

我为ARM嵌入式设备(运行DD-WRT的华硕RT-AC68U路由器)交叉编译了一个小型Hello World程序:

# arm-linux-gnueabi-g++ hello.cpp -mcpu=cortex-a9 -s -o hello

该文件似乎很好:

# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=5099693c31154cdd7f04c16ced5b80b1e35e625b, stripped

这取决于几个库:

# readelf -d hello

Dynamic section at offset 0xf08 contains 26 entries:
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
(...)

当我尝试在目标系统上执行该文件时,我得到以下内容:

# ./hello
-sh: ./hello: not found

如果我从ld-linux.so.3启动执行而没有任何其他参数,那么一切正常:

# /opt/lib/ld-linux.so.3 ./hello
Hello, world.

列出库时,文件似乎在/ lib文件夹中搜索库(它们不在那里,它们在/ opt / lib中):

# /opt/lib/ld-linux.so.3 --list ./hello
    libstdc++.so.6 => /lib/libstdc++.so.6 (0x76dfb000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x76de0000)
    libc.so.6 => /opt/lib/libc.so.6 (0x76cb2000)
    libc.so => /lib/libc.so (0x76c35000)
    /lib/ld-linux.so.3 => /opt/lib/ld-linux.so.3 (0x76f20000)

我猜这个错误是因为可执行文件在自己启动时找不到所需的共享库。所有必需的库都存在于/ opt / lib文件夹中,该文件夹包含在LD_LIBRARY_PATH环境变量中:

# echo $LD_LIBRARY_PATH
/lib:/usr/lib:/jffs/lib:/jffs/usr/lib:/jffs/usr/local/lib
:/mmc/lib:/mmc/usr/lib:/opt/lib:/opt/usr/lib

如何让可执行文件在正确的位置找到库?

编辑:我尝试在可执行文件中静态链接库,程序在目标平台上运行正常。然而,对于我想要做的事情,这不是一个可行的解决方案。

1 个答案:

答案 0 :(得分:4)

您的ld-linux.so.3似乎位于非标准位置(/opt/lib),您的gcc可能正在指定其他程序解释程序。您可以使用readelf -l <program>来检查二进制文件所期望的程序解释器(在PT_INTERP下,“请求程序解释器”)。

如果您的平台的二进制程序解释程序有误,您可以通过将-Wl,--dynamic-linker=/opt/lib/ld-linux.so.3传递给gcc来手动指定它。