跨平台定位crti

跨平台定位crti,c,compiler-construction,llvm,crt,C,Compiler Construction,Llvm,Crt,我的问题是,我有一个编译器,它输出LLVM位代码/IR文件.ll/.bc,这些文件使用llc out.ll-t obj-o out.o编译成对象文件 问题是,要形成可执行文件I,编译器需要将它们与crti.o/crt0.o/crt1.o链接起来。没有这些,甚至没有args等。由于堆栈显然没有16位对齐,应用程序至少在macOS上会立即出现故障,我认为其他操作系统可能会因其他操作系统的特定要求而出现问题 我认为,与其重新发明轮子,不如让我的编译器链接到crt0/crt1/crti,因为它们似乎有不

我的问题是,我有一个编译器,它输出LLVM位代码/IR文件.ll/.bc,这些文件使用llc out.ll-t obj-o out.o编译成对象文件

问题是,要形成可执行文件I,编译器需要将它们与crti.o/crt0.o/crt1.o链接起来。没有这些,甚至没有args等。由于堆栈显然没有16位对齐,应用程序至少在macOS上会立即出现故障,我认为其他操作系统可能会因其他操作系统的特定要求而出现问题

我认为,与其重新发明轮子,不如让我的编译器链接到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生成目标代码