首页 文章

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

提问于
浏览
6

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

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

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

  • arm-gcc.exe:用于针对ARM的裸机交叉编译 .

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

我感兴趣的点是:

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

2 回答

  • 3
    • ABI的差异取决于你如何调用编译器,例如GCC有 -mabi ,它可以是'apcs-gnu','atpcs','aapcs','aapcs-linux'和'iwmmxt'之一 .

    • 存在各种运行时功能的裸机限制,因为有人没有提供它们 . 是他们初始化零分配区域或提供C功能 . 如果你能提供它们,它们就会起作用 .

    • 二进制级别差异也取决于您如何调用编译器 .

    你可以查看GCC ARM options online .

  • 1

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

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

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

相关问题