这个论坛里的很多问题都是从“为什么我的代码不能运行...”开始的
我在 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 上运行的?