在跨平台的基础上定位crti

问题描述 投票:0回答:1

我的问题是我有一个编译器输出LLVM bitcode / 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提供了一些扫描仪来执行此操作,但找不到任何能够实现此目的的LLVM / LLC标志。如果没有跨平台CRT,我如何在不同的目标/操作系统之间实现一致的启动。

c compiler-construction llvm crt
1个回答
0
投票

为您提供这些详细信息并不是我们的工作(毕竟,有限责任公司只是一个开发者方面的工具,它不打算用于最终产品)。

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

在您的情况下,最简单的方法是使用clang执行链接步骤,因为已经处理了所有必要的平台详细信息。哦,你根本就不需要它,因为clang会愉快地为你的LLVM IR制作目标代码。

© www.soinside.com 2019 - 2024. All rights reserved.