跨平台定位crti

Locating crti on cross-platform basis

我的问题是我有一个编译器可以输出 LLVM bitcode/IR 文件 (.ll/.bc),这些文件使用 llc out.ll -t obj -o out.o 编译成目标文件。

问题是,要形成可执行文件,我(编译器)需要 link 这些 crti.o/crt0.o/crt1.o。如果没有这些(即使没有 args 等),应用程序会立即出现段错误(至少在 macOS 上是这样,因为堆栈显然不是 16 位对齐的),我认为其他 OSs 上可能存在问题由于其他 OS 特定要求。

与其重新发明轮子,我认为让我的编译器 link 到 crt0/crt1/crti 会更简单,但是它们似乎有不同的名称,具体取决于 OS 并且相当几个因素。虽然在大多数 POSIX 机器上它似乎在 /usr/lib/crt{0|1|i},但我找不到任何关于 Windows-equivilent 在哪里的信息,它至少会模拟 crt 的行为.

我的问题是,使用编译器的 .o 文件实现 crt 的 linking 的跨平台方式是什么? GCC/Clang 似乎发出了其中嵌入了 crt 的目标文件,所以我想知道这些编译器是如何实现它的,我也想知道如何实现它。我认为我最好的选择是,如果 LLVM/LLC 提供一些 wat 来执行此操作,但找不到任何 LLVM/LLC 标志来完成此操作。如果没有跨平台的 CRT,我如何才能在不同 targets/OSes.

之间实现一致的启动

为您提供这些详细信息不是 llc 的工作(毕竟,llc 只是一个 developer-side 工具,并不打算在最终产品中使用)。

既不是 GCC 也不是 clang "emit object files with crt embedded inside them"。相反,它们包含 platform-specific 驱动程序逻辑来找出库搜索路径、链接器 cmdline 等。显然,"cross-platform CRT" 是不可能的,因为需要以某种方式处理必要的平台细节。

对于您的情况,最简单的方法是使用 clang 执行链接步骤,因为所有必要的平台细节都已处理。哦,你根本不需要 llc,因为 clang 会很乐意为你的 LLVM IR 生成目标代码。