2014-10-05 12 views
8

Mam problemy z budowaniem przenośnego pliku wykonywalnego z rdzą.Przenośne pliki binarne z rdzą

Uruchomienie pliku wykonywalnego prostu zbudowany z cargo build na Ubuntu nie z

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

Budynek z rustc ... -C link-args=-static nie odwołuje się prawidłowo (wyjście ld ./test):

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

Czy istnieje sposób wokół to oprócz budowy na starszym systemie ze starą wersją glibc?

+2

Pytasz o "Portable" binariów, ale tylko lista jeden system (Ubuntu) bez informacji o wersji. Czy w grę wchodzi wiele systemów? Jeśli tak, to jakie są dystrybucje i ich wersje? – Shepmaster

Odpowiedz

3

Glibc nie jest statycznie połączony (tak jak byśmy chcieli, to robi wszystko, aby temu zapobiec). W rezultacie biblioteki systemowe (libstd i inne) są zawsze zależne od wersji glibc, na której zostały zbudowane. Właśnie dlatego buildboty w klastrze linuxa używają starych wersji centów.

Zobacz https://github.com/rust-lang/rust/issues/9545 i https://github.com/rust-lang/rust/issues/7283

Niestety w tej chwili wierzę, nie ma obejście oprócz upewniając się budować w systemie ze starszym glibc niż masz zamiar wdrożyć ją.

-1

Aby uniknąć błędów GLIBC, możesz skompilować własną wersję Rust przeciwko statycznej alternatywnej bibliotece libc, musl.

Pobierz najnowszą stabilną wersją MUSL i zbudować go z opcją --disable-shared:

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

następnie zbudować Rust przeciwko MUSL:

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

następnie zbudować projekt

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

Dla Więcej informacji na ten temat można znaleźć w sekcji dokumentacji: advanced linking.

Jak podano w oryginalnej dokumentacji:

Jednakże, być może trzeba przekompilować natywnych bibliotek przeciwko MUSL zanim będą mogły być połączone przeciw.


Można również użyć rustup.

Usuń rdza zainstalowany przez rustup.sh

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

Install 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 
Powiązane problemy