在跨平台的基础上定位crti
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在跨平台的基础上定位crti相关的知识,希望对你有一定的参考价值。
我的问题是我有一个编译器输出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,我如何在不同的目标/操作系统之间实现一致的启动。
为您提供这些详细信息并不是我们的工作(毕竟,有限责任公司只是一个开发者方面的工具,它不打算用于最终产品)。
GCC和clang都没有“发出嵌入了crt的对象文件”。相反,它们包含特定于平台的驱动程序逻辑,以确定库搜索路径,链接器cmdline等。显然,没有“跨平台CRT”是可能的,因为需要以某种方式处理必要的平台细节。
在您的情况下,最简单的方法是使用clang执行链接步骤,因为已经处理了所有必要的平台详细信息。哦,你根本就不需要它,因为clang会愉快地为你的LLVM IR制作目标代码。
以上是关于在跨平台的基础上定位crti的主要内容,如果未能解决你的问题,请参考以下文章