假设您有一个交叉编译工具链,它为ARM体系结构生成二进制文件 .
您的工具链是这样的(在使用Linux的X86_64机器上运行):
-
arm-linux-gnueabi-gcc.exe:用于Linux的交叉编译,在ARM上运行 .
-
arm-gcc.exe:用于针对ARM的裸机交叉编译 .
...以及用于ARM交叉编译的大量其他工具 .
我感兴趣的点是:
- (E)二进制文件之间的ABI差异(如果有的话)
在裸机的情况下 - 限制(如动态内存分配,在C的情况下使用静态构造函数,线程模型等)
根据每个案例的具体信息(如调试信息支持等),2个案例之间的 - 二进制级差异;
2 回答
ABI的差异取决于你如何调用编译器,例如GCC有
-mabi
,它可以是'apcs-gnu','atpcs','aapcs','aapcs-linux'和'iwmmxt'之一 .存在各种运行时功能的裸机限制,因为有人没有提供它们 . 是他们初始化零分配区域或提供C功能 . 如果你能提供它们,它们就会起作用 .
二进制级别差异也取决于您如何调用编译器 .
你可以查看GCC ARM options online .
我最近开始了一个在裸机环境中使用Linux标准C库的小项目 . 我一直在我的博客上描述它:http://ellcc.org/blog/?page_id=289基本上我所做的是设置一种处理Linux系统调用的方法,这样通过实现某些系统调用的简化版本,我可以使用标准库中的函数 . 例如,ARM的当前状态实现了read(),readv(),write(),writev()和brk()的简化版本 . 这允许我使用printf(),fgets()和malloc()不变 .
我是我的情况,我使用相同的编译器来定位Linux和裸机 . 由于它是基于clang / LLVM的,我也可以使用相同的编译器来定位其他处理器 . 我现在正在为Mips做一个裸机示例 .
所以我想答案是没有任何区别 .