【问题标题】:Locating crti on cross-platform basis在跨平台的基础上定位 crti
【发布时间】:2018-03-04 18:02:02
【问题描述】:

我的问题是我有一个编译器,它输出 LLVM 位码/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 提供一些 wat 来执行此操作,但找不到任何 LLVM/LLC 标志来完成此操作。如果没有跨平台 CRT,如何实现跨不同目标/操作系统的一致启动。

【问题讨论】:

    标签: c compiler-construction llvm crt


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多