14

我正在运行安装了 qemu、qemu-user 和 gnueabi 工具链的 Linux Mint 14。arm-linux-gnueabi-gcc test.c -o test我用 .c 编译了test.c。

当我尝试跑步时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正如我之前尝试过的那样,Running给出了/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 程序而不必模拟整个 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
4

6 回答 6

31

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

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

还要确保未设置 LD_LIBRARY_PATH。

unset LD_LIBRARY_PATH
于 2013-06-20T05:57:10.433 回答
13
$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi

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

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

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

于 2016-04-08T13:20:54.810 回答
12

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

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

然后

qemu-arm a.out

不会报“找不到/lib/ld-linux.so.3”的错误。

唯一的缺点是可执行文件可能很大。但是当您只想测试您的代码时,它会很有帮助。

当然,您可以使用 Balau 的方法(请参阅 artless noise 的答案)。但是如果你不想在这一步中因为“UART串口”之类的东西而感到沮丧,这只是为了运行一个简单的“测试”功能,试试我的修复。

于 2013-10-14T16:07:06.307 回答
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

如果我有兴趣知道其他更好的解决方案,请告诉我。

于 2013-05-23T19:25:27.957 回答
1

如果你想在没有 Linux 的情况下运行ARM,那么你需要一个不同的编译器(至少)。 arm-linux-gnueabi-gccLinux的编译器。和编译器libc有着密切的联系。您将需要一个带有qemunewlib可移植层的编译器。移植新库

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

通常会调用非 Linux gcc arm-none-eabi-gcc。某些配置脚本可以识别前缀arm-none-eabi- 。

于 2013-04-23T01:34:45.240 回答
0

对我有用的一个变体是直接传递加载器库并使用 loader 参数指定所需的库路径--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.

于 2016-05-17T16:20:48.147 回答