我正在尝试使用 LLVM 构建一个小型编译器,以了解整个生态系统是如何工作的。我已经生成了目标文件。现在,我对链接部分有点困惑。据我了解,clang 会找到系统中存在的默认链接器(除非另有说明)并使用system
orfork_exec
调用进行链接。这与用户从命令行手动运行链接器几乎相同。
但是,我也知道 llvm 工具链中有一个名为lld的项目,它是另一个链接器,但速度更快,可以链接不同类型的目标文件(COFF、ELF 等)。所以,我在想为什么 clang 不使用 lld 本身。我的意思是,为什么不在其源代码中将其用作库,在该库中,它以目标文件和其他标志作为参数调用函数,并将最终二进制文件作为返回类型(或通过引用参数)。它可以发布自己的 lld 版本,而不必依赖系统链接器(也许作为后备)。除了代码重用之外,还有什么其他原因不能以编程方式完成吗?
还有一些问题:
- 系统中的所有链接器是否都支持交叉链接(即,我可以在 windows 中使用链接器来生成 linux 二进制文件)吗?
- 除了硬编码通常随附的系统链接器之外,是否有命令或任何其他方式在我的程序中查找系统链接器?
当我说系统时,我指的是操作系统。