Как создать статически связанные исполняемые файлы?

Я пытаюсь создать статический исполняемый файл с Rust. Я не пытаюсь статически связать определенную библиотеку, я пытаюсь создать исполняемый файл, который вообще не использует динамическую компоновку. У меня есть следующий (иначе работающий) тест:

$ 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]

Обратите внимание на dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2. Вместо статических исполняемых файлов statically linked. (И в моем случае corrupted section header size, хотя я был бы приятно удивлен, если бы смог убедить Rust воспроизвести это.)

Какие параметры мне нужно передать в rustc, чтобы заставить его генерировать фактический статический исполняемый файл (для конкретности: тот, который даже file согласен, статически связан).

Ответы

Ответ 1

Rust статически связывает все, кроме glibc (и libgcc, iirc) по умолчанию.

Если вы хотите получить 100% статически связанную бинарную версию, вы можете использовать MUSL с 1.1. https://github.com/rust-lang/rust/pull/24777 - это первоначальная поддержка, мы надеемся сделать ее намного проще в будущем.

Ответ 2

Мой вариант использования - это, я хочу избежать этой очень распространенной ситуации в окнах:

Программа не может быть запущена, поскольку отсутствует VCRUNTIME140.dll компьютер. Попробуйте переустановить программу, чтобы устранить эту проблему.

Это решение работает, но доступно только в ночное время (2017-06-06). Добавьте это в свой файл .cargo/config (используйте подходящую тройку для своей платформы):

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

Альтернативой редактированию конфигурации груза является передача -C target-feature=+crt-static в rustc вручную.

RFC: https://github.com/rust-lang/rfcs/blob/master/text/1721-crt-static.md

Запрос Pull: https://github.com/rust-lang/rust/pull/37545

Конфигурация груза: http://doc.crates.io/config.html