【问题标题】:Why do cross-compilers have a two stage compilation?为什么交叉编译器有两阶段编译?
【发布时间】:2014-12-13 10:28:56
【问题描述】:

我目前正在尝试了解交叉编译器的工作原理。我对两阶段编译器编译过程有点困惑。

据我所知,应用了以下程序:

  • 为目标架构编译 bintutils
  • 编译 GCC(第 1 阶段)
  • 用 GCC 编译 newlib/eglibc/...
  • 用 libc 编译 GCC(第 2 阶段)

为什么涉及第二阶段?我不能用-lc 之类的标志调用第一阶段编译器来包含libc吗?

【问题讨论】:

标签: gcc dependencies cross-compiling


【解决方案1】:

我不确定为什么 gcc 有如此复杂的构建过程。我基于 clang/LLVM 的 ELLCC (http://ellcc.org) 跨工具链项目构建如下:

  1. 编译编译器(使用 gcc 或网站上提供的 ELLCC 编译器的预构建版本。)。
  2. 使用编译器为所有目标构建 C++ 和 C 库。
  3. 为所有目标构建 binutils 和 gdb(对于所有目标:不要制作目标特定的实用程序,除了汇编程序。ld、gdb、objdump 等都支持这一点)
  4. (可选)使用新构建的编译器为所有目标交叉构建自身。

顺便说一句,ELLCC 目前支持 Linux 和裸机执行环境的 ARM、Microblaze、Mips、PowerPC 和 x86 目标。

【讨论】:

  • Richard:我在尝试在 Windows 上构建一个简单的“hello world”程序时遇到了问题。我得到“ecc.exe:错误:无法执行命令:无法执行程序'C:\ellcc\ellcc\bin/ecc-ld.exe'未知错误”
  • 拉曼:显然这与文件解压缩的方式有关:sites.google.com/a/gautherot.net/www/introdcttioellcc
  • 啊,是的。那解决了它。我注意到它在 Windows 上生成的是静态二进制文件。是否有一些东西可以动态链接到 CRT 等各种运行时?
  • 对不起,目前我只制作静态库。最终我想添加 .so 支持。 C 库 musl 确实支持动态的,我只是还没开始用那种方式构建它。
  • 理查德:另一个问题。那么当我在 Windows 上使用这个编译器构建时,你链接到哪个 C 库?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2013-10-10
  • 1970-01-01
相关资源
最近更新 更多