假设您有一个为ARM体系结构生成二进制文件的交叉编译工具链。
您的工具链是这样的(在带有Linux的X86_64机器上运行):
- arm-linux-gnueabi-gcc.exe:用于linux的交叉编译,在arm上运行
- arm-gcc.exe:用于针对arm的裸机交叉编译
以及在ARM上进行交叉编译的大量其他工具。
我感兴趣的是:
- (E) 二进制文件之间的ABI差异(如果有)
- 裸机情况下的限制(如动态内存分配、C++情况下静态构造函数的使用、线程模型等)
- 两种情况在特定信息方面的二进制级别差异(如调试信息支持等)
- ABI的差异取决于您如何调用编译器,例如GCC有
-mabi
,它可以是"apcs gnu"、"atpcs"、"aapcs","aapcs-linux"one_answers"iwmmxt"之一 - 由于有人没有提供各种运行时功能,因此存在对这些功能的裸机限制。无论是初始化零分配区域还是提供C++功能。如果你能提供它们,它们就会起作用
- 二进制级别的差异也取决于调用编译器的方式
您可以在线检查GCC ARM选项。
我最近开始了一个小项目,在裸机环境中使用Linux标准C库。我一直在我的博客上描述它:http://ellcc.org/blog/?page_id=289基本上,我所做的是设置一种处理Linux系统调用的方法,这样通过实现某些系统调用的简化版本,我就可以使用标准库中的函数。例如,ARM的当前状态实现了read()、readv()、write(),writev()和brk()的简化版本。这允许我在不改变的情况下使用printf()、fgets()和malloc()。
就我而言,我使用相同的编译器来针对Linux和裸机。由于它是基于clang/LLVM的,所以我也可以使用相同的编译器来针对其他处理器。我现在正在为Mips制作一个裸金属的例子。
所以我想答案是没有任何区别。