如何在尝试使用qemu-arm运行arm二进制文件时解决"加载共享库时出错"?

Dav*_*vid 11 arm qemu

我正在运行Linux Mint 14,安装了qemu,qemu-user和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: -
Run Code Online (Sandbox Code Playgroud)

有谁知道如何让qemu运行arm程序而不必模拟整个ARM内核?

test.c是

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

并且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
Run Code Online (Sandbox Code Playgroud)

小智 24

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

qemu-arm -L /usr/arm-linux-gnueabi/
Run Code Online (Sandbox Code Playgroud)

还要确保未设置LD_LIBRARY_PATH.

unset LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)


Nin*_*ing 11

在使用汇编代码运行C程序时,我也遇到了这个问题.我的解决方案是使用选项"-static"构建可执行文件

arm-linux-gnueabi-gcc -static -g main.c square.s
Run Code Online (Sandbox Code Playgroud)

然后

qemu-arm a.out
Run Code Online (Sandbox Code Playgroud)

不会报告错误,说"找不到/lib/ld-linux.so.3".

唯一的缺点是可执行文件可能具有较大的大小.但是,当您只想测试代码时,它会很有用.

当然,你可以使用Balau的方法(参见artless noise的答案).但是,如果你不想在这一步中感到沮丧,比如"UART串口",只需运行一个简单的"测试"功能,那就试试我的修复.


Mit*_*ta_ 7

$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi
Run Code Online (Sandbox Code Playgroud)

这对我有用。基本上与以下内容相同:

$ qemu-arm -L /usr/arm-linux-gnueabi/
Run Code Online (Sandbox Code Playgroud)

您可以将其添加到〜/ .bashrc文件中,这样就不必在每次打开终端时都键入它。


Mon*_*lal 5

我通过将以下库复制到/ 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
Run Code Online (Sandbox Code Playgroud)

如果我有兴趣了解其他更好的解决方案,请告诉我.

  • 是的当然这会有效,但在这种情况下你需要运行Linux.最初的问题想要**避免**Linux.您没有复制库并运行没有Linux内核的*qemu*虚拟机?这似乎不可能. (3认同)

art*_*ise 1

如果你想在没有 Linux 的情况下运行ARM,那么你需要一个不同的编译器(至少)。 是Linuxarm-linux-gnueabi-gcc的编译器。和编译器是紧密相连的。您将需要一个带有qemu可移植层的编译器。移植新库libcnewlib

请参阅:BalauGoogle newlib+qemu。一个newlib端口托管在Github上,似乎与Balau博客相同。

通常,非 Linux gcc 称为arm-none-eabi-gcc. 一些配置脚本可以识别前缀arm-none-eabi- 。

  • 如果您想进行系统调用,那么这很重要,对于不需要系统调用的裸机工作,您可以在大多数情况下使用arm-linux-gnueabi 或arm-none-eabi 风格的工具链。 (2认同)