Портативные бинарные файлы с Rust

У меня проблемы с созданием переносимого исполняемого файла с ржавчиной.

Запуск исполняемого файла, просто построенного с cargo build на Ubuntu не удается с

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

Здание с rustc ... -C link-args=-static не может правильно связать (вывод ld ./test):

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

Есть ли способ обойти это, кроме сборки на старой системе со старой версией glibc?

2 ответа

Решение

Glibc не связан статически (как бы нам этого ни хотелось, он старается изо всех сил предотвратить это). В результате системные библиотеки (libstd и подобные) всегда зависят от версии glibc, на которой они были собраны. Вот почему сборочные боты в кластере Linux, которые использует Mozilla, являются / были старыми версиями centos.

См. https://github.com/rust-lang/rust/issues/9545 и https://github.com/rust-lang/rust/issues/7283

К сожалению, в настоящее время я считаю, что нет обходного пути, кроме того, чтобы убедиться, что вы строите систему с более старым glibc, чем вы собираетесь развернуть.

Чтобы избежать ошибок GLIBC, вы можете скомпилировать свою собственную версию Rust со статической альтернативой libc, musl.

Получить последнюю стабильную версию musl и собрать ее с опцией --disable-shared:

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

затем построить Руст против мусла:

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

затем создайте свой проект

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

Для получения дополнительной информации смотрите раздел "Дополнительные ссылки " в документации.

Как указано в оригинальной документации:

Тем не менее, вам может понадобиться перекомпилировать ваши нативные библиотеки против musl, прежде чем они могут быть связаны с.


Вы также можете использовать rustup.

Удалите старый Rust, установленный rustup.sh

$ sudo /usr/local/lib/rustlib/uninstall.sh # only if you have 
$ rm $HOME/.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
Другие вопросы по тегам