Как создать статически связанные исполняемые файлы?
Я пытаюсь создать статический исполняемый файл с 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