我正在运行Linux Mint 14,安装了qemu,qemu-user和gnueabi工具链。我用arm-linux-gnueabi-gcc test.c -o test
编译了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
会提供/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
答案 0 :(得分:21)
您可以通过使用-L标志提供arm-linux-gnueabi共享库的路径来运行该示例。
qemu-arm -L /usr/arm-linux-gnueabi/
还要确保未设置LD_LIBRARY_PATH。
unset LD_LIBRARY_PATH
答案 1 :(得分:10)
在使用汇编代码运行C程序时,我也遇到了这个问题。我的解决方案是使用选项“-static”构建可执行文件,例如
arm-linux-gnueabi-gcc -static -g main.c square.s
然后
qemu-arm a.out
不会报告错误,说“无法找到/lib/ld-linux.so.3”。
唯一的缺点是可执行文件可能具有较大的大小。但是,如果您只想测试代码,它会很有用。
当然,您可以使用Balau的方法(参见无艺术噪音的答案)。但是如果你不想在这一步中感到沮丧,比如“UART串口”,这只是为了运行一个简单的“测试”功能,试试我的修复。
答案 2 :(得分: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
如果我有兴趣了解其他更好的解决方案,请告诉我。
答案 3 :(得分:1)
如果你想在没有Linux的情况下运行 ARM ,那么你需要一个不同的编译器(至少)。 arm-linux-gnueabi-gcc
是 Linux 的编译器。编译器与libc
密切相关。您将需要一个newlib
编译器,其中包含 qemu 的可移植层。 porting newlib
请参阅:Balau和Google newlib+qemu。 newlib
端口位于Github,与 Balau 博客相同。
通常,非Linux gcc称为arm-none-eabi-gcc
。前缀 arm-none-eabi - 可被某些配置脚本识别。
答案 4 :(得分: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
。