Начиная с этого исходного кода:
fn main() {
println!("Hello, world!");
}
Вы можете создать LLVM промежуточное представление (IR) или битовый код (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-f4a73f2c70e583e1 -o hello2 hello.o
Затем вы можете запустить программу:
DYLD_LIBRARY_PATH=/path/to/stage2/lib/rustlib/x86_64-apple-darwin/lib/ ./hello2
В этом ответе есть решения для macOS, но общие концепции должны распространяться на Linux и Windows. Реализация будет немного отличаться для Linux и, вероятно, сильно для Windows. Примечательно, что я использую DYLD_LIBRARY_PATH
, так как я динамически связался со стандартной библиотекой Rust, которой нет в моем обычном пути поиска библиотек.
Обратите внимание, что файлы LLVM IR и BC не имеют самых сильных гарантий прямой/обратной совместимости. Это означает, что вам необходимо использовать версию llc
, совместимую с используемой вами версией rustc
. Для этого ответа я использовал llc
, созданный моей локальной сборкой для разработки Rust:
% rustc --version --verbose
rustc 1.53.0 (53cb7b09b 2021-06-17)
binary: rustc
commit-hash: 53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b
commit-date: 2021-06-17
host: x86_64-apple-darwin
release: 1.53.0
LLVM version: 12.0.1
% llc --version
LLVM (http://llvm.org/):
LLVM version 12.0.1-rust-dev
Optimized build.
Default target: x86_64-apple-darwin20.5.0
Host CPU: skylake
Смотрите также:
person
Shepmaster
schedule
24.05.2016
rustc
— это компилятор Rust, он не компилирует другие входные форматы. Почему бы не использовать LLVMllc
или эквивалент, если у вас есть биткод? - person Shepmaster   schedule 24.05.2016