arm-none-eabi-gcc - arm-none-eabi-gcc 代码程序如何在 x86 机器上运行?
问题描述
这个论坛里的很多问题都是从“为什么我的代码不能运行...”开始的
我在 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 上运行的?
解决方案
推荐阅读
- tomcat7 - 使用 Hibernate 5.3.7 配置的 JCache 引发异常原因:java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException
- java - 使用 gson.fromJson 时如何修复 NumberFormatException
- tcl - 多次使用 TK 剪贴板
- javascript - 如何让我的按钮在移动设备上工作?
- javascript - 在扩展初始化之前阻止 chrome 网络请求
- r - R:未找到分配有 read_csv 数据的变量
- javascript - 为什么在heroku中托管时导航器的剪贴板对象未定义?
- c - 如何使用指针使用 malloc 存储多个字符串
- javascript - 如何读取隐藏的 ID Firestore
- angular - 在 mat-select 或 mat-selection-list 中使用 mat-option AND mat-radio-button