我交叉编译一个小的Hello World程序的ARM嵌入式设备(华硕RT-AC68U路由器运行DD-WRT):有效的ARM可执行文件未找到库
# 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)
我猜的错误是由于这样的事实,对自己推出的可执行文件时没有找到所需的小号hared图书馆。所有需要的库都存在在/ 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
如何获得可执行找到合适的地方的图书馆?
编辑:我试着在可执行文件中静态链接库,程序在目标平台上运行良好。但是,这不是我想要做的可行的解决方案。
也许你只需要在你的二进制文件上设置exec权限,例如:'chmod a + x。/ hello' – dewaffled
@frymode谢谢,但那不是,它有正确的标志:'-rwxr-xr-x 1 root root 5720 Jan 10 11:40 hello' – charles
你的'LD_LIBRARY_PATH'中是否有换行符?还是只是复制粘贴的工件? – nneonneo