C / C ++裸机编译与特定操作系统(Linux)的编译有什么区别?

时间:2014-04-11 09:15:20

标签: c++ linux gcc arm bare-metal

假设您有一个交叉编译工具链,它为ARM体系结构生成二进制文件。

您的工具链是这样的(在使用Linux的X86_64计算机上运行):

  • arm-linux-gnueabi-gcc.exe:用于Linux的交叉编译,在ARM上运行。
  • arm-gcc.exe:用于针对ARM的裸机交叉编译。

...以及用于ARM交叉编译的大量其他工具。

我感兴趣的点是:

  • (E)二进制文件之间的ABI差异(如果有的话)
  • 裸机的限制(如动态内存分配,在C ++中使用静态构造函数,线程模型等)
  • 2个案例之间的二进制级差异,具体针对每个案例的信息(如调试信息支持等);

2 个答案:

答案 0 :(得分:3)

  • ABI差异取决于你如何调用编译器,例如GCC有-mabi,它可以是'apcs-gnu','atpcs','aapcs','aapcs-linux'和' iwmmxt”。
  • 存在各种运行时功能的裸机限制,因为有人没有提供它们。是他们初始化零分配区域或提供C ++功能。如果你能提供它们,它们就会起作用。
  • 二进制级别差异也取决于您如何调用编译器。

您可以查看GCC ARM options online

答案 1 :(得分:1)

我最近开始了一个在裸机环境中使用Linux标准C库的小项目。我一直在我的博客上描述它:http://ellcc.org/blog/?page_id=289 基本上我所做的就是设置一种处理Linux系统调用的方法,这样通过实现某些系统调用的简化版本,我可以使用标准库中的函数。例如,ARM的当前状态实现了read(),readv(),write(),writev()和brk()的简化版本。这允许我使用printf(),fgets()和malloc()不变。

我是我的情况,我使用相同的编译器来定位Linux和裸机。由于它是基于clang / LLVM的,我也可以使用相同的编译器来定位其他处理器。我现在正在为Mips做一个裸机示例。

所以我猜答案是没有任何区别。