2016-05-24 18 views
8

Come posso generare un eseguibile di un'applicazione scritta in Rust che è stata compilata nel codice a barre LLVM-IR?Generazione dell'eseguibile Rust dal codice a barre LLVM

Se provo a compilare il file .bc con rugc mi dice stream did not contain valid UTF-8 e non riesco a capire se esiste una opzione specifica in rustc per questo.

Fondamentalmente voglio ottenere questo: program.rs ->program.bc ->program. Dove program è l'eseguibile finale. Quali passi dovrei fare per raggiungere questo obiettivo?

+1

'rustc' è il compilatore Rust, esso non viene compilato altri formati di input. Perché non utilizzare LLVM 'llc' o equivalente se si dispone del codice bit? – Shepmaster

+0

Questa è stata la mia ipotesi iniziale, ma non ho molta familiarità con l'ambiente e ho trovato questo: -filetype - Scegli un tipo di file (non tutti i tipi sono supportati da tutti i target): = asm - Emetti un assembly ('.s') file = obj - Emetti un file oggetto nativo ('.o') = null - Non emettere nulla, per il test delle prestazioni. Nessuno di loro sembrava quello che stavo cercando. –

risposta

5

A partire da questo codice sorgente:

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

È possibile creare LLVM rappresentazione intermedia (IR) o codice binario che (BC):

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

Questi file possono poi essere ulteriormente elaborati da LLVM per produrre l'assemblaggio o un file oggetto :

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

Quindi è necessario collegare i file per produrre un file eseguibile. Ciò richiede il collegamento alle librerie standard di Rust. Il percorso è piattaforma e la versione-dipendente:

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

È possibile quindi eseguire il programma:

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

Questa risposta ha soluzioni specifiche OS X, ma i concetti generali dovrebbe essere estensibile a Linux e Windows. L'implementazione sarà leggermente diversa per Linux e probabilmente molto per Windows.

+0

Che cos'è DYLD_LIBRARY_PATH =/percorso/a/stage2/lib/rustlib/x86_64-apple-darwin/lib/for? –

+1

@LeonardoMarques Quando ho collegato i file oggetto con la libreria standard, ha utilizzato il collegamento dinamico. Poiché la libreria standard di Rust non si trova nel percorso di ricerca della libreria predefinito, devo informare il linker dinamico dove trovarlo al momento dell'esecuzione del programma. Potresti invece creare un binario statico (che per me è un po 'complicato su OS X, quindi l'ho saltato) o se la libreria standard si trovava nel percorso di ricerca il linker di runtime saprebbe dove trovarlo. – Shepmaster

+0

non è -lstd-2f39a9bd suposed per avere un'estensione .dylib?Perché è complicato costruire un binario statico? –

4

Non è evidente dal momento che la documentazione LLVM è molto oscuro, ma clang compilerà sia i file LLVM IR link (".ll ') e file di codice binario che (' .BC"), e con le librerie di sistema.

Su Linux con Rust 1.9:

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