- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是我有一个编译器,它输出 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/
我正在使用 GNU 工具链构建一个项目,一切正常,直到我开始链接它,链接器提示它丢失/找不到 crti.o .这不是我的目标文件之一,它似乎与 libc 有关,但我不明白为什么它需要这个 crti.o
我正在使用 GNU 工具链构建一个项目,一切正常,直到我开始链接它,链接器提示它丢失/找不到 crti.o。这不是我的目标文件之一,它似乎与 libc 有关,但我不明白为什么它需要这个 crti.o,
我正在尝试构建一个基于 GCC4.5 和 newlib 的交叉编译工具链,并启用了黄金和链接时间优化。 GCC 编译正常,但没有生成 crt1.o 或 crti.o 文件。因此,当我尝试使用编译器构建
在尝试为 arm 构建 gcc 4.x.x 交叉编译器时,我被困在丢失的 crti.o 处。 $BUILD_DIR/gcc 中的文件子目录。 安 strace在顶层 Makefile显示编译后的 xg
我想为 startfile 指定 GCC 的搜索目录和endfile :crt1.o , crti.o和 crtn.o .路过-B在命令行上 GCC 驱动程序工作,但不方便。我如何修改规范 文件 (
我在这里阅读了类似问题的“解决方案”: Link 1 Link 2 Link 3 我已经尝试重新安装 libc-dev、binutils、build-install、gcc-multilib 和链接解
我真的需要一些帮助。我正在尝试为我的论文编译和执行一些程序。 问题是,我以前从未使用过 Fortran,所以我盲目地依赖文档....它说要使用一些命令来完成工作,特别是 setenv bc03 PAT
我想知道程序是如何工作的,这样我就可以尽可能地把它弄得简单粗暴,我在组装时到处乱搞。 我刚刚发现了如何使用 wprintf 函数为 x86_64 汇编代码(发现宽字符是 32 位)。我所要做的就是链接
如何修复 Build TinyCCompiler(TCC) from Source 中 crt1.o,crti.o 的错误? https://github.com/LuaDist/tcc 我正在我的桌
我是一名优秀的程序员,十分优秀!