2014-10-05 11 views
8

Ho problemi nella creazione di un eseguibile portatile con ruggine.Binari portatili con Rust

Esecuzione di un eseguibile semplicemente costruito con cargo build su Ubuntu non riesce con

./test: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./test) 

Edificio con rustc ... -C link-args=-static non riesce a collegare correttamente (uscita di ld ./test):

ld: error in ./test(.eh_frame); no .eh_frame_hdr table will be created. 

C'è un modo per aggirare questo, tranne la costruzione su un vecchio sistema con una vecchia versione di glibc?

+2

Stai chiedendo informazioni su binari "portatile", ma è solo lista un sistema (Ubuntu) senza alcuna informazione sulla versione. Ci sono più sistemi coinvolti? In caso affermativo, quali sono le distribuzioni e le loro versioni? – Shepmaster

risposta

3

Glibc non è collegato staticamente (per quanto ci sarebbe piaciuto, si fa in quattro per impedirlo). Di conseguenza, le librerie di sistema (libstd e simili) dipendono sempre dalla versione di glibc su cui sono state create. Questo è il motivo per cui i buildbot negli usi di mozilla del cluster linux sono/erano vecchie versioni di centos.

Vedi https://github.com/rust-lang/rust/issues/9545 e https://github.com/rust-lang/rust/issues/7283

Purtroppo in questo momento credo che ci sia alcuna soluzione oltre a fare in modo di costruire su un sistema con una glibc più vecchio di te sta andando a distribuire a.

-1

Per evitare errori GLIBC, è possibile compilare la propria versione di Rust rispetto a una libc alternativa statica, musl.

Ottenere l'ultima release stabile di MUSL e costruirlo con l'opzione --disable-shared:

$ mkdir musldist 
$ PREFIX=$(pwd)/musldist 
$ ./configure --disable-shared --prefix=$PREFIX 

poi costruire Rust contro MUSL:

$ ./configure --target=x86_64-unknown-linux-musl --musl-root=$PREFIX --prefix=$PREFIX 

quindi creare il Progetto

$ echo 'fn main() { println!("Hello, world!"); }' > main.rs 
$ rustc --target=x86_64-unknown-linux-musl main.rs 
$ ldd main 
    not a dynamic executable 

Per maggiori informazioni, guarda la sezione advanced linking della documentazione.

Come riportato nella documentazione originale:

Tuttavia, potrebbe essere necessario ricompilare le librerie native contro MUSL prima che possano essere collegati contro.


È anche possibile utilizzare rustup.

Rimuovere vecchia ruggine installato da rustup.sh

$ sudo /usr/local/lib/rustlib/uninstall.sh # only if you have 
$ rm $HOME/.rustup 

Installare rustup

$ curl https://sh.rustup.rs -sSf | sh 
$ rustup default nightly #just for ubuntu 14.04 (stable Rust 1.11.0 has linking issue) 
$ rustup target add x86_64-unknown-linux-musl 
$ export PATH=$HOME/.cargo/bin:$PATH 
$ cargo new --bin hello && cd hello 
$ cargo run --target=x86_64-unknown-linux-musl 
$ ldd target/x86_64-unknown-linux-musl/debug/hello 
    not a dynamic executable