【发布时间】:2021-11-23 00:59:03
【问题描述】:
我一直在研究构建跨工具链,并且对 gcc 的编译和工作有一个普遍的疑问。
问题是关于official gcc documentation的这段摘录:
为了构建 GCC,C 标准库和头文件必须存在于将为其构建目标库的所有目标变体(不仅是宿主 C++ 编译器的变体)。
为什么构建(交叉)编译器本身需要目标的标准库?宿主机上运行的(交叉)编译器不应该只需要构建宿主机的标准库就可以编译目标的标准库吗?
我还在 crosstool-NG 的 how a toolchain is constructed 上找到了这个:
最终的编译器需要 C 库,知道如何使用它,但是:构建 C 库需要编译器
这与上面所说的一致,但我不明白为什么最终编译器需要针对预构建的目标 C 库构建,只是知道如何在以后使用它。对于目标 C 库,主机编译器有什么需要了解的?在编译时将目标程序与目标的标准库链接不是链接器的工作吗?
【问题讨论】:
-
诚实的答案是:懒惰。 GCC 跨工具链引导程序充满了丑陋的杂物,而且有些地方彻底坏掉了。根据您的问题:实际上曾经有一个 GCC 交叉引导错误,其中 libc 的 automake/configure 阶段会失败,因为 configure 确实使用交叉编译器来构建功能测试程序并尝试在主机架构上运行它(这显然行不通,除非使用 binfmtmisc 和 qemu 的组合来透明地支持外部架构二进制文件)。
-
我唯一能找到并知道的是
gnu/stubs.h,基本上有__stub_FUNCTION,在配置gcc时用于detecting if function exists。
标签: c gcc cross-compiling gnu toolchain