如何生成用Rust编写的编译成LLVM-IR bitcode的应用程序的可执行文件?
如果我尝试使用rustc编译.bc文件,它会告诉我stream did not contain valid UTF-8
我似乎无法弄清楚rustc中是否有特定的选项。
基本上我想实现这个目标:
program.rs
- > program.bc
- > program
。
其中program
是最终的可执行文件。我应该采取哪些措施来实现这一目标?
答案 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