【发布时间】:2018-03-04 18:02:02
【问题描述】:
我的问题是我有一个编译器,它输出 LLVM 位码/IR 文件 (.ll/.bc),这些文件使用 llc out.ll -t obj -o out.o 编译为目标文件。
问题是,为了形成一个可执行文件,我(编译器)需要将它们与crti.o/crt0.o/crt1.o 链接起来。如果没有这些(即使没有 args 等),应用程序会立即出现段错误(至少在 macOS 上,因为堆栈显然不是 16 位对齐的),我认为由于其他操作系统特定的要求,其他操作系统可能会出现问题。
与其重新发明轮子,我认为将我的编译器链接到 crt0/crt1/crti 会更简单,但是它们似乎有不同的名称,具体取决于操作系统和很多因素。虽然在大多数 POSIX 机器上它似乎位于 /usr/lib/crt{0|1|i},但我找不到任何关于 Windows 等效的信息至少可以模拟 crt 的行为。
我的问题是,我可以通过什么跨平台方式实现crt 与编译器的.o 文件的链接? GCC/Clang 似乎发出嵌入了 crt 的目标文件,所以我想知道这些编译器是如何实现它的,以及我如何也能实现它。我认为我最好的选择是如果 LLVM/LLC 提供一些 wat 来执行此操作,但找不到任何 LLVM/LLC 标志来完成此操作。如果没有跨平台 CRT,如何实现跨不同目标/操作系统的一致启动。
【问题讨论】:
标签: c compiler-construction llvm crt