2014-10-05 6 views
8

Ich habe Probleme beim Erstellen einer tragbaren ausführbaren Datei mit Rost.Tragbare Binärdateien mit Rust

eine ausführbare Lauf einfach mit cargo build auf Ubuntu aufgebaut irgendwie

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

Gebäude mit rustc ... -C link-args=-static richtig (Ausgabe von ld ./test) keine Verbindung herstellen kann:

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

Gibt es eine Möglichkeit, um dieses außer den Bau auf einem älteren System mit einer alten Glibc-Version?

+2

Du über "portable" Binärdateien zu fragen, aber Sie nur Liste ein System (Ubuntu) ohne Versionsinformationen. Sind mehrere Systeme beteiligt? Wenn ja, was sind die Distributionen und ihre Versionen? – Shepmaster

Antwort

3

Glibc ist nicht statisch verknüpft (so wie wir es gerne gehabt hätten, es geht nicht darum, dies zu verhindern). Daher sind die Systembibliotheken (libstd usw.) immer von der glibc-Version abhängig, auf der sie erstellt wurden. Aus diesem Grund sind die Buildbots im Linux-Cluster mozilla alte Versionen von Centos.

Siehe https://github.com/rust-lang/rust/issues/9545 und https://github.com/rust-lang/rust/issues/7283

Leider zu diesem Zeitpunkt Ich glauben, es keine Abhilfe Seite ist von dafür, dass Sie mit einem älteren glibc auf einem System bauen, als Sie zu implementieren gehen.

-1

Um GLIBC-Fehler zu vermeiden, können Sie Ihre eigene Version von Rust gegen eine statische alternative libc, musl, kompilieren.

die letzte Version von MUSL Holen und bauen es mit der Option --disable-shared:

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

dann Rust gegen MUSL bauen:

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

dann bauen Ihr Projekt

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

Für Weitere Informationen finden Sie im Abschnitt advanced linking der Dokumentation.

Wie in der ursprünglichen Dokumentation berichtet:

Allerdings müssen Sie Ihre nativen Bibliotheken gegen MUSL neu kompiliert werden, bevor sie gegen verknüpft werden können.


Sie können auch rustup verwenden.

alte Rust installiert Entfernen von rustup.sh

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

Installieren 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