ld - Binarios portátiles con Rust
static-linking rust-cargo (2)
Tengo problemas para construir un ejecutable portátil con óxido.
Ejecutar un ejecutable simplemente construido con cargo build
en Ubuntu falla con
./test: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14'' not found (required by ./test)
Construir con rustc ... -C link-args=-static
no se puede enlazar correctamente (salida de ld ./test
):
ld: error in ./test(.eh_frame); no .eh_frame_hdr table will be created.
¿Hay alguna forma de evitar esto, excepto construir en un sistema anterior con una versión anterior de glibc?
Glibc no está vinculado estáticamente (como nos hubiera gustado, se desvive por evitarlo). Como resultado, las bibliotecas del sistema (libstd y demás) siempre dependen de la versión glibc en la que se crearon. Esta es la razón por la cual los buildbots en el cluster de linux que utiliza mozilla son / eran versiones antiguas de centos.
Ver https://github.com/rust-lang/rust/issues/9545 y https://github.com/rust-lang/rust/issues/7283
Lamentablemente, en este momento, creo que no hay ninguna solución aparte de asegurarse de construir en un sistema con un glibc más antiguo del que se va a implementar.
Para evitar errores GLIBC, puede compilar su propia versión de Rust frente a una libc alternativa estática, musl .
Obtenga la última versión estable de musl y compárela con la opción --disable-shared
:
$ mkdir musldist
$ PREFIX=$(pwd)/musldist
$ ./configure --disable-shared --prefix=$PREFIX
luego construye Rust contra musl:
$ ./configure --target=x86_64-unknown-linux-musl --musl-root=$PREFIX --prefix=$PREFIX
luego crea tu proyecto
$ echo ''fn main() { println!("Hello, world!"); }'' > main.rs
$ rustc --target=x86_64-unknown-linux-musl main.rs
$ ldd main
not a dynamic executable
Para obtener más información, consulte la sección de enlace avanzada de la documentación.
Como se informó en la documentación original:
Sin embargo, es posible que necesite recompilar sus bibliotecas nativas en contra de musl antes de que puedan vincularse.
También puedes usar rustup .
Eliminar el antiguo Rust instalado por rustup.sh
$ sudo /usr/local/lib/rustlib/uninstall.sh # only if you have
$ rm $HOME/.rustup
Instalar 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