web-dev-qa-db-fra.com

Comment générer des exécutables liés statiquement?

J'essaie de créer un exécutable statique avec Rust. J'essaie pas de lier statiquement une bibliothèque particulière, j'essaie de créer un exécutable qui n'utilise pas du tout de lien dynamique. J'ai le test suivant (sinon fonctionne):

$ cat hello.rs
fn main()
    {
    print!("Hello, world!\n");
    }
$ rustc hello.rs -o hello
$ file hello
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
 dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, [etc]

Noter la dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2. Les exécutables statiques ont statically linked au lieu. (Et dans mon cas corrupted section header size, bien que je serais agréablement étonné de pouvoir convaincre Rust de répliquer que.)

Quelles options dois-je passer à rustc pour qu'il génère un véritable exécutable statique (pour plus de concrétité: celui qui même file convient est lié statiquement).

33
David X

Rust lie statiquement tout sauf glibc (et libgcc, iirc) par défaut.

Si vous voulez obtenir un binaire 100% lié statiquement, vous pouvez utiliser MUSL avec 1.1. https://github.com/Rust-lang/Rust/pull/24777 est le support initial, nous espérons le rendre beaucoup plus facile à utiliser à l'avenir.

20
Steve Klabnik

Depuis Rust 1.19 , vous pouvez lier statiquement le runtime C (CRT) pour éviter cette situation très courante sur Windows:

Le programme ne peut pas démarrer car VCRUNTIME140.dll manque sur votre ordinateur. Essayez de réinstaller le programme pour résoudre ce problème.

Ajoutez ceci à votre .cargo/config fichier, en utilisant le triple cible approprié pour votre plate-forme:

[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]

Une alternative à l'édition .cargo/config est de passer -C target-feature=+crt-static à rouiller à la main.

Voir également:

14
arkod