从LLVM位代码生成Rust可执行文件

从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)或位

如何生成用Rust编写并编译成LLVM-IR位代码的应用程序的可执行文件

如果我尝试用rustc编译.bc文件,它会告诉我
流没有包含有效的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。另见。堆栈溢出将这些细节充实到了一起。:-)