0

这个论坛里的很多问题都是从“为什么我的代码不能运行...”开始的

我在 Ubuntu 18.04 上开发,在笔记本电脑(Windows x86)上作为 VM 机器运行。以下用 gcc 编译和链接的程序运行良好并显示 64 位地址。

char *s = "Hello\n"; printf ("Hello at address: %p\n", s);

我的假设是 arm-none-eabi 以系统裸机为目标。当然,我并不是想在裸机上运行上述程序。但我试图了解交叉编译是如何工作的。

与 arm-none-eabi-gcc (从 Ubuntu 安装)编译和链接的同一程序表明很多缺少引用(_exit ...等) - 正常。创建的代码是 ARM 汇编语言,我使用 arm-none-eabi-objdump 进行了验证。

在加载时添加选项 --specs=nosys.specs 可以解决缺少的引用 - 正如预期的那样。当我在 Ubuntu 上运行它时,会自动调用 QEMU 并出现分段错误。我对分段错误并不感到惊讶,但 QEMU 的自动启动是出乎意料的。

将选项更改为 --spec=rdimon.specs 也可以解决缺少的引用 - 正如预期的那样。但是尽管创建的汇编代码是 arm,但它在 Ubuntu (x86) 上运行。显示的地址为 32 位。

我知道 rdimon.specs 与半托管有关,但我认为这仅在程序在目标(arm 处理器)上运行并与运行 gdb 的主机通信时才被激活。显然我错了。

很抱歉这么长的序言......简单的问题:我的 arm 代码是如何在 x86 上运行的?

4

1 回答 1

0

这是binfmt 机制的结果。安装 qemu 时,它会注册自己以运行非本地可执行文件,并在执行非本地 ELF 时透明地调用。当使用 rdimon 规范启用半主机时,它会链接一组合适的与主机环境协作的 libc 存根。

于 2020-06-10T15:32:53.843 回答