从LLVM bitcode生成Rust可执行文件

时间:2016-05-24 14:16:34

标签: rust llvm-ir bitcode

如何生成用Rust编写的编译成LLVM-IR bitcode的应用程序的可执行文件?

如果我尝试使用rustc编译.bc文件,它会告诉我stream did not contain valid UTF-8我似乎无法弄清楚rustc中是否有特定的选项。

基本上我想实现这个目标: program.rs - > program.bc - > program。 其中program是最终的可执行文件。我应该采取哪些措施来实现这一目标?

2 个答案:

答案 0 :(得分:5)

从这个源代码开始:

fn main() {
    println!("Hello, world!");
}

您可以创建LLVM 中间代表(IR)或 bitcode (BC):

# IR in hello.ll
rustc hello.rs --emit=llvm-ir
# BC in hello.bc
rustc hello.rs --emit=llvm-bc

然后LLVM可以进一步处理这些文件以生成程序集目标文件

# Assembly in hello.s
llc hello.bc
# Object in hello.o
llc hello.bc --filetype=obj

然后,您需要链接文件以生成可执行文件。这需要链接到Rust标准库。路径依赖于平台和版本:

cc -L/path/to/stage2/lib/rustlib/x86_64-apple-darwin/lib/ -lstd-2f39a9bd -o hello2 hello.o

然后您可以运行该程序:

DYLD_LIBRARY_PATH=/path/to/stage2/lib/rustlib/x86_64-apple-darwin/lib/ ./hello2

这个答案有OS X特定的解决方案,但的一般概念可以扩展到Linux和Windows。 Linux的实现略有不同,可能对Windows有很大帮助。

答案 1 :(得分:4)

由于LLVM文档非常模糊,但并不明显,但 clang 将编译LLVM IR文件(" .ll")和bitcode文件(&# 34; .bc"),并与您的系统库链接。

在带有Rust 1.9的Linux上:

clang -dynamic-linker /usr/local/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-d16b8f0e.so  hello.ll -o hello