【问题标题】:What are the differences between C/C++ bare-metal compilation and compilation for a specific OS (Linux)?C/C++ 裸机编译和针对特定操作系统(Linux)的编译有什么区别?
【发布时间】:2014-05-25 08:36:58
【问题描述】:

假设您有一个为 ARM 架构生成二进制文件的交叉编译工具链。

你的工具链是这样的(运行在带有 Linux 的 X86_64 机器上):

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

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

我感兴趣的点是:

  • (E)二进制文件之间的 ABI 差异(如果有)
  • 裸机情况下的限制(如动态内存分配、在 C++ 情况下使用静态构造函数、线程​​模型等)
  • 这两种情况在各自特定信息方面的二进制级别差异(如调试信息支持等);

【问题讨论】:

  • 这听起来像是“我的小程序和我的操作系统之间的区别”...
  • @deviantfan:听起来更像是“我可以使用 C/C++ 的所有“正常”特性来进行固件(裸机)开发吗?”在这里阅读这篇文章后:state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf 我注意到了裸机 C/C++ 的一些限制。还有更多(还有差异)吗? :)
  • 对于真正的裸机,你需要为newlib写一个可移植层。在 Gnu Linux 上,使用 eglibcglibc。基本上,您的问题是有什么区别。有1000个。你想使用mmap()吗?等等。二进制/编译器的差异并不重要(大部分)。完全不同的是“C”库。文件 I/O?

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


【解决方案1】:
  • ABI 差异取决于您调用编译器的方式,例如 GCC 有 -mabi,它可以是 'apcs-gnu'、'atpcs'、'aapcs'、'aapcs-linux' 和 'iwmmxt' 之一.
  • 关于各种运行时功能的裸机限制存在,因为有人没有提供它们。无论是初始化零分配区域还是提供 C++ 功能。如果你能提供它们,它们就会起作用。
  • 二进制级别的差异还取决于您调用编译器的方式。

您可以查看GCC ARM options online

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2016-10-18
      • 2018-07-11
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多