【发布时间】:2013-04-16 01:21:17
【问题描述】:
我正在运行安装了 qemu、qemu-user 和 gnueabi 工具链的 Linux Mint 14。我用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 程序而不必模拟整个 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
【问题讨论】:
-
如果在没有操作系统的情况下运行, printf 是您最不想做的事情,当然不是您想为该系统编写的第一个程序。打开一个在 qemu 上没有意义的 LED,但是将一个字符从串行端口/uart 干扰到串行终端通常是微不足道的。此外,您可能希望从汇编程序而不是 C 开始,因为引导代码也不是微不足道的,因为您必须确保了解内存映射、程序加载位置等。
-
这来自未作为系统库安装的 arm 库(即使它们作为交叉编译器的目标库安装)。如果发行版支持它,那么您可以将 arm 安装为多架构目标(例如如何同时支持 x86 和 x86_64)。在 Ubuntu 中,这类似于
apt-add-architecture arm && apt-get install libc6:arm。我不知道薄荷。如果您不想考虑,只需使用-static编译即可。