cha*_*les 4 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
Run Code Online (Sandbox Code Playgroud)
该文件看起来不错:
# 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
Run Code Online (Sandbox Code Playgroud)
它依赖于几个库:
# 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]
(...)
Run Code Online (Sandbox Code Playgroud)
当我尝试在目标系统上执行该文件时,我得到以下信息:
# ./hello
-sh: ./hello: not found
Run Code Online (Sandbox Code Playgroud)
ld-linux.so.3如果我在没有任何其他参数的情况下启动执行,则一切正常:
# /opt/lib/ld-linux.so.3 ./hello
Hello, world.
Run Code Online (Sandbox Code Playgroud)
列出库时,该文件似乎在 /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)
Run Code Online (Sandbox Code Playgroud)
我猜测该错误是由于可执行文件自行启动时找不到所需的共享库。所有必需的库都存在于 /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
Run Code Online (Sandbox Code Playgroud)
如何获取可执行文件以在正确的位置找到库?
编辑:我尝试在可执行文件中静态链接库,并且程序在目标平台上运行良好。然而,对于我想做的事情来说,这不是一个可行的解决方案。
您的ld-linux.so.3位置似乎位于非标准位置 ( /opt/lib),并且您可能gcc指定了不同的程序解释器。您可以使用它readelf -l <program>来检查您的二进制文件需要什么程序解释器(在PT_INTERP“请求程序解释器”下)。
如果二进制文件的程序解释器对于您的平台来说是错误的,您可以通过传递-Wl,--dynamic-linker=/opt/lib/ld-linux.so.3给 来手动指定它gcc。