C/C++裸机编译和针对特定操作系统(Linux)的编译之间有什么区别



假设您有一个为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制作一个裸金属的例子。

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

相关内容

  • 没有找到相关文章

最新更新