2016-01-10 63 views
4

我交叉编译一个小的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 

如何获得可执行找到合适的地方的图书馆?

编辑:我试着在可执行文件中静态链接库,程序在目标平台上运行良好。但是,这不是我想要做的可行的解决方案。

+0

也许你只需要在你的二进制文件上设置exec权限,例如:'chmod a + x。/ hello' – dewaffled

+0

@frymode谢谢,但那不是,它有正确的标志:'-rwxr-xr-x 1 root root 5720 Jan 10 11:40 hello' – charles

+0

你的'LD_LIBRARY_PATH'中是否有换行符?还是只是复制粘贴的工件? – nneonneo

回答

4

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

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

+0

@nneoneo你是一个天才,修复它。太感谢了。我使用的编译命令如下:'arm-linux-gnueabi -g ++ hello.cpp -mcpu = cortex-a9 -Wl, - dynamic-linker =/opt/lib/ld-linux.so.3 -o hello ' – charles

相关问题