最近我一直在使用GCC进行交叉编译,并发现了一个看似复杂的区域,即工具链。
我不太明白这一点,因为我的印象是GCC可以为大多数常见架构创建二进制机器代码,而其他真正重要的是你链接的库和创建的可执行类型。 / p>
海湾合作委员会不能自己做所有这些事吗?通过单一构建的GCC,所有适当的库和发送到GCC的正确标志,我可以为Windows x86机器生成PE可执行文件,然后为嵌入式Linux MIPS设备创建ELF可执行文件,最后为OSX PowerPC创建可执行文件机? 如果没有,有人可以解释你将如何实现这一目标吗?
答案 0 :(得分:12)
单一的GCC构建,全部 适当的库和正确的 发送到GCC的标志,我可以生产一个 适用于Windows x86的PE可执行文件 机器,然后创建一个ELF可执行文件 对于嵌入式Linux MIPS设备和 最后是OSX的可执行文件 PowerPC机器?如果没有人可以 解释你将如何实现这一目标?
没有。单个GCC构建为一个目标体系结构生成目标代码。您需要针对Intel x86的构建,针对MIPS的构建以及针对PowerPC的构建。但是,尽管您可以通过单次调用GCC将源代码构建到可执行文件中,但编译器并不是您需要的唯一工具。在引擎盖下,它还使用了汇编程序(as
)和链接程序(ld
),并且需要为目标体系结构和平台构建这些程序集。通常GCC使用GNU binutils包中的这些工具的版本,因此您也需要为目标平台构建它们。
您可以阅读有关构建交叉编译工具链here的更多信息。
我不像以前那样理解这一点 在GCC可以创造的印象下 大多数的二进制机器代码 常见架构
从某种意义上说,GCC本身的源代码可以构建到针对各种体系结构的编译器中,但是你仍然需要单独的构建。
关于-march
,这不允许GCC的相同构建在平台之间切换。相反,它用于选择允许用于同一系列处理器的指令。例如,最早的x86处理器不支持现代x86处理器支持的一些指令,因为它们是稍后介绍的(例如MMX和SSE等扩展指令集)。当您传递-march
时,GCC将启用该处理器及其前身支持的所有操作码。引用GCC手册:
选择特定的cpu类型时会 为此安排适当的事情 特别是芯片,编译器不会 生成任何不运行的代码 没有-march = cpu-type的i386 正在使用的选项。
答案 1 :(得分:2)
如果您想尝试交叉编译,并且不想自己构建工具链,我建议您查看CodeSourcery。他们有一个基于GNU的工具链,他们的免费“Lite”版本支持相当多的架构。我已经将它用于Linux / ARM和Android / ARM。