C语言 在跨平台的基础上定位 CRTI



我的问题是我有一个编译器,它输出LLVM位码/IR文件(.ll/.bc),并且这些文件使用llc out.ll -t obj -o out.o编译为目标文件。

问题是,要形成可执行文件,我(编译器)需要将这些与crti.o/crt0.o/crt1.o链接。如果没有这些(即使没有参数等),应用程序会立即出现段错误(至少在 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,如何跨不同目标/操作系统实现一致的启动。

为您提供这些详细信息不是LLC的工作(毕竟,LLC只是一个开发人员端工具,它不打算用于最终产品)。

GCC 和 clang 都不会"发出嵌入 crt 的对象文件"。相反,它们包含特定于平台的驱动程序逻辑,用于确定库搜索路径、链接器 cmdline 等。显然,不可能使用"跨平台CRT",因为需要以某种方式处理必要的平台细节。

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

最新更新