如何解决“错误而载入共享库”试图运行与QEMU臂臂二进制文件时?(How to solve “err

2019-08-31 20:38发布

我运行Linux Mint的14 QEMU,QEMU用户,并安装了gnueabi工具链。 我编译test.c的与arm-linux-gnueabi-gcc test.c -o test

当我尝试和运行qemu-arm /usr/arm-linux-gnueabi/lib/ld-linux.so.3 test

我得到一个错误说: test: error while loading shared libraries: test: cannot open shared object file: No such file or directory 。 运行qemu-arm test ,因为我之前已经试过,给人/lib/ld-linux.so.3: No such file or directory

但是,文件的确存在并可达。

$ stat /usr/arm-linux-gnueabi/lib/ld-linux.so.3
  File: `/usr/arm-linux-gnueabi/lib/ld-linux.so.3' -> `ld-2.15.so'
  Size: 10          Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d  Inode: 4083308     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-04-22 16:19:48.090613901 -0700
Modify: 2012-09-21 08:31:29.000000000 -0700
Change: 2013-04-22 15:58:41.042542851 -0700
 Birth: -

有谁知道我怎样才能使QEMU运行的ARM程序,而不必效仿的整个手臂的Linux内核?

test.c的是

#include <stdio.h>
int main() {
    printf("this had better work\n");
}

file test

test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xf2e49db65394b77c77ee5b65b83c0cc9220cbfc0, not stripped

Answer 1:

如果你想在不运行Linux ARM,那么你需要一个不同的编译器(至少)。 arm-linux-gnueabi-gcc是用于Linux的编译器。 编译器和libc是密切联系的。 您将需要一个newlib的编译器与QEMU可移植性层。 移植newlib

请参阅: 巴劳和谷歌newlib + QEMU 。 一个newlib端口在托管Github上 ,似乎一样的娑罗双博客。

通常,非Linux GCC被称为arm-none-eabi-gcc 。 前缀臂无-eabi-被一些配置脚本的认可。



Answer 2:

可以通过提供使用-L标志臂的linux-gnueabi共享库的路径运行该示例。

qemu-arm -L /usr/arm-linux-gnueabi/

也确保LD_LIBRARY_PATH没有设置。

unset LD_LIBRARY_PATH


Answer 3:

与运行汇编代码C程序的时候我也遇到了这个问题。 我的解决办法是建立一个能与选项可执行“-static”,例如

arm-linux-gnueabi-gcc -static -g main.c square.s

然后

qemu-arm a.out

不会报告错误说“无法找到/lib/ld-linux.so.3”。

唯一的缺点是,可执行文件可能是大尺寸。 但它是有帮助的,当你只是想测试你的代码。

当然,你可以从巴劳方法去(见烂漫噪音的答案)。 但是,如果你不想感到像在这一步,这是只运行一个简单的“测试”功能“UART串行端口”受挫,去为我修复的一个尝试。



Answer 4:

我解决了通过复制以下库到/ lib中的问题,但我认为应该有一个更好的方式解决,而不是这个讨厌的解决办法,我发明的!

sudo cp  /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib
sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib
sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib

请让我知道是否有其他更好的解决方案,因为我想知道。



Answer 5:

$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi

这对我的作品。 它基本上是同样的事情:

$ qemu-arm -L /usr/arm-linux-gnueabi/

你可以把它添加到〜/ .bashrc文件,这样你就不必每次你打开终端输入。



Answer 6:

一个变种,其工作对我来说,是直接通过装载库,并指定使用装载程序参数所需的库路径--library-path 。 例如:

$ TOOLCHAIN_ROOT=/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf
$ qemu-arm $TOOLCHAIN_ROOT/libc/lib/ld-linux-armhf.so.3 --library-path $TOOLCHAIN_ROOT/libc/lib/arm-linux-gnueabihf:/$TOOLCHAIN_ROOT/lib ./my_executable

或等价出口LD_LIBRARY_PATH而不是使用--library-path



文章来源: How to solve “error while loading shared libraries” when trying to run an arm binary with qemu-arm?
标签: arm qemu