gpt4 book ai didi

c - 跨平台定位crti

转载 作者:行者123 更新时间:2023-11-30 14:50:12 26 4
gpt4 key购买 nike

我的问题是我有一个编译器,它输出 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/LLcflags来完成此操作。如果没有跨平台的 CRT,我如何才能在不同的目标/操作系统之间实现一致的启动。

最佳答案

为您提供这些详细信息并不是 llc 的工作(毕竟 llc 只是一个开发者端工具,它并不打算在最终产品中使用)。

GCC 和 clang 都不会“发出嵌入了 crt 的目标文件”。相反,它们包含特定于平台的驱动程序逻辑来确定库搜索路径、链接器命令行等。显然,“跨平台 CRT”是不可能的,因为需要以某种方式处理必要的平台详细信息。

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

关于c - 跨平台定位crti,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49098562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com