首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用自定义llc编译Rust程序?

如何使用自定义llc编译Rust程序?
EN

Stack Overflow用户
提问于 2018-10-22 07:49:15
回答 1查看 1.5K关注 0票数 12

我有一个定制的LLVM后端,并且希望为这个自定义(nostd)目标交叉编译Rust。我想分两个步骤编译Rust程序:

  1. 使用rustc生成LLVM IR。
  2. 使用我自己的optllc将LLVM IR转换成机器代码。

我试过使用cargo rustc -- --emit=llvm-ir。我得到.ll文件,然后使用llc获取.o文件。然后,我以同样的方式交叉编译libcore。当我试图将所有对象链接到一起时,它会告诉我一个未定义的引用。我使用的是libcorerustc的相同提交。这似乎是LLVM版本的一个问题,但我不确定。

EN

回答 1

Stack Overflow用户

发布于 2019-05-31 17:13:18

有几件事你应该知道。最重要的是,rustc默认使用的LLVM版本(如果从rustup或发行版包管理器获得)是/不是/一个LLVM的实际发行版,并且可能实际上与特定的llvm版本不兼容bitcode。我们在我的项目中解决了这个问题,方法是使用--llvm-root标志来构建生锈源来进行配置。然后,您可以使用rustup toolchain link将构建的锈迹链接到定制的锈蚀工具链中。

其次,如果至少使用rustc 1.34并将-C链接器-plugin标志传递给rustc,则可以使rustc发出包含而不是机器代码的-C文件。我还编写了以下脚本,该脚本可以解压缩包含目标代码的rlib文件,并将其打包为包含llvm bitcode的rlib文件,如果上述方法对您无效的话。

代码语言:javascript
复制
#!/bin/bash
dir="$(mktemp -d)"
trap "rm -rf $dir" INT TERM EXIT
archive=$(realpath -m $1)
cd "$dir"
ar x "$archive"
rm ./*.rcgu.o
for file in *.bc.z; do
len=`od -An -t u4 -j 15 -N4 $file`
blen=`od -An -t u8 -j $((len+19)) -N8 $file`
tail -c+$((len+28)) $file | head -c $blen > $file.bc.gz
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" |cat - $file.bc.gz |gzip -dc > ${file%.bc.z}.o
done
rm *.bc.z
rm *.gz
rm "$archive"
llvm-ar rs "${archive}" ./*

一旦您拥有了rlib文件,您就可以使用它们上的任何llvm工具链工具,就像使用包含llvm的.a文件一样。

就执行最后一个环节而言,有几件事要记住。首先,rustc自动生成符号__rust_alloc__rust_alloc_zeroed__rust_dealloc__rust_realloc,并将它们指向__rg_alloc (分别是类似的__rg_符号),这是默认使用jemalloc的GlobalAlloc实现,或者是__rdl_alloc (和类似的__rdl_符号),后者是由libc malloc驱动的系统分配程序。如果您没有使用rustc来完成最后的链接,那么您必须自己实现这些符号。

其次,libstd和libcore依赖于其他库,这些库可能还需要链接。根据您正在使用的标准库的哪个部分,您可能会发现需要不同的库集,因此如果没有特定的错误消息,我就无法帮助您,但是我可以告诉您,我的应用程序最终需要的库列表是按顺序排列的:std, core, alloc, unwind, compiler_builtins, panic_abort, backtrace_sys, rustc_demangle。如果您使用的是panic=unwind,那么显然您必须使用它。如果您发现仍然有丢失的符号,我建议使用nm查找包含缺失符号的库,并通过反复尝试确定它属于链接器顺序的位置。

希望这会有所帮助,因为我已经花费了相当多的精力来设计解决这个确切问题的方法(虽然不是为了交叉编译的目的)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52924569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档