6

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

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

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

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

我感兴趣的点是:

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

2 回答 2

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

您可以在线查看 GCC ARM 选项

于 2014-04-11T10:29:02.553 回答
1

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

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

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

于 2014-05-12T18:59:50.923 回答