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

问题描述 投票:0回答:2

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

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

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

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

我感兴趣的点是:

  • (E)二进制文件之间的 ABI 差异(如果有)
  • 裸机情况下的限制(例如动态内存分配、C++ 情况下静态构造函数的使用、线程模型等)
  • 这两种情况在特定于每种情况的信息方面存在二进制级别的差异(例如调试信息支持等);
c++ linux gcc arm bare-metal
2个回答
3
投票
  • ABI 差异取决于您如何调用编译器,例如 GCC 有
    -mabi
    ,可以是“apcs-gnu”、“atpcs”、“aapcs”、“aapcs-linux”和“iwmmxt”之一。
  • 由于没有人提供各种运行时功能的裸机限制,因此存在这些限制。无论是初始化零分配区域还是提供 C++ 功能。如果您能提供它们,它们就会起作用。
  • 二进制级别的差异还取决于您如何调用编译器。

您可以在线查看GCC ARM选项


1
投票

我最近启动了一个小项目,在裸机环境中使用 Linux 标准 C 库。我已经在我的博客上描述过它:http://ellcc.org/blog/?page_id=289

基本上我所做的就是建立一种处理 Linux 系统调用的方法,以便通过实现某些系统调用的简化版本,我可以使用标准库中的函数。例如,ARM 的当前状态实现了

read()
readv()
write()
writev()
brk()
的简化版本。这使我可以不变地使用
printf()
fgets()
malloc()

就我而言,我使用相同的编译器来针对 Linux 和裸机。由于它是基于 Clang/LLVM 的,因此我还可以使用相同的编译器来定位其他处理器。我现在正在为 MIPS 开发一个裸机示例。

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.