从LLVM位代码生成Rust可执行文件
如何生成用Rust编写并编译成LLVM-IR位代码的应用程序的可执行文件 如果我尝试用rustc编译.bc文件,它会告诉我从LLVM位代码生成Rust可执行文件,rust,llvm-ir,bitcode,Rust,Llvm Ir,Bitcode,如何生成用Rust编写并编译成LLVM-IR位代码的应用程序的可执行文件 如果我尝试用rustc编译.bc文件,它会告诉我流没有包含有效的UTF-8,我似乎无法确定rustc中是否有一个特定的选项 基本上,我想做到这一点: program.rs->program.bc->program。 其中,程序是最终可执行文件。我应该采取哪些步骤来实现这一点?从以下源代码开始: fn main() { println!("Hello, world!"); } 您可以创建LLVM中间表示(IR)或位
流没有包含有效的UTF-8
,我似乎无法确定rustc中是否有一个特定的选项
基本上,我想做到这一点:
program.rs
->program.bc
->program
。
其中,
程序
是最终可执行文件。我应该采取哪些步骤来实现这一点?从以下源代码开始:
fn main() {
println!("Hello, world!");
}
您可以创建LLVM中间表示(IR)或位码(BC):
hello.ll中的IR
rustc hello.rs--emit=llvm-ir
#BC在hello.BC中
rustc hello.rs--emit=llvm bc
然后,LLVM可以进一步处理这些文件以生成程序集或对象文件:
hello.s中的程序集
llc hello.bc
#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\u LIBRARY\u PATH=/PATH/to/stage2/lib/rustlib/x86\u 64-apple-darwin/lib//hello2
这个答案有特定于OSX的解决方案,但一般概念应该可以扩展到Linux和Windows。Linux的实现会略有不同,Windows的实现可能会大不相同。这并不明显,因为LLVM文档非常模糊,但clang将编译LLVM IR文件(“.ll”)和位码文件(“.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
rustc
是Rust编译器,它不编译其他输入格式。如果您有位码,为什么不使用LLVM的llc
或等效文件?这是我最初的猜测,但我对llc不是很熟悉,只发现了以下内容:-文件类型-选择文件类型(并非所有目标都支持所有类型):=asm-发出程序集('.s')文件=obj-发出本机对象('.o')文件=null-不发出任何内容,用于性能测试。DYLD_LIBRARY_PATH=/PATH/to/stage2/lib/rustlib/x86_64-apple-darwin/lib/for?@LeonardoMarques当我将对象文件与标准库链接时,它使用了动态链接。由于Rust标准库不在我的默认库搜索路径中,我必须在程序执行时通知动态链接器在何处找到它。您可以构建一个静态二进制文件(在OS X上这对我来说有点棘手,所以我跳过了它),或者如果标准库位于搜索路径中,运行时链接器会知道在哪里可以找到它。是否应该使用-lstd-2f39a9bd来具有.dylib扩展名?为什么构建静态二进制文件很棘手?@LeonardoMarques这就是-l
标志的工作原理。它在库
前面加上.dylib
(或.so
,或任何适合平台的东西)。@LeonardoMarques。另见。堆栈溢出将这些细节充实到了一起。:-)