2015-08-02 5 views
19

Ich versuche, eine statische ausführbare Datei mit Rust zu erstellen. Ich bin nicht versuchen, eine bestimmte Bibliothek statisch zu verknüpfen, ich versuche, eine ausführbare Datei zu erstellen, die keine dynamische Verknüpfung überhaupt verwendet. Ich habe folgendes (sonst funktioniert) Test:Wie generiert man statisch verknüpfte ausführbare Dateien?

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

Notiere die dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2. Statische ausführbare Dateien haben stattdessen statically linked. (Und in meinem Fall corrupted section header size, obwohl ich wäre angenehm erstaunt, wenn ich Rust überzeugen kann dass zu replizieren.)

Welche Möglichkeiten habe ich, um rustc passieren müssen, um es eine tatsächliche statische ausführbare Datei (für Konkretion zu erzeugen : eine, die sogar file stimmt, ist statisch verknüpft).

+0

Vielleicht sind die C-Link-args = '...' Option können Sie helfen? – llogiq

+0

Beachten Sie, dass sich Ihre Frage nur auf Linux bezieht - AFAIK, [Sie können keine ausführbaren Dateien unter OS X statisch verknüpfen] (https://developer.apple.com/library/mac/qa/qa1118/_index.html). Ich bin mir nicht sicher über Windows. – Shepmaster

+3

Vielleicht möchten Sie einen Blick auf [mit Hilfe von Müsl anstelle von Glibc mit Rost] werfen (https://github.com/rust-lang/rust/pull/24777) –

Antwort

14

Rust statisch verbindet alles außer Glibc (und libgcc, Iirc) standardmäßig.

Wenn Sie eine 100% statisch verknüpfte Binärdatei erhalten möchten, können Sie MUSL mit 1.1 verwenden. https://github.com/rust-lang/rust/pull/24777 ist die anfängliche Unterstützung, wir hoffen, es in der Zukunft viel einfacher zu machen.

4

Mein Anwendungsfall ist das, möchte ich diese sehr häufige Situation auf Fenster vermeiden:

Das Programm kann nicht gestartet werden, da VCRUNTIME140.dll von Ihrem Computer fehlt. Versuchen Sie das Programm neu zu installieren, um dieses Problem zu beheben.

Diese Lösung funktioniert, aber derzeit nur auf nächtlichen (2017.06.06). Fügen Sie diese auf Ihre .cargo/config-Datei (Verwendung geeignetes Ziel triple für Ihre Plattform):

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

Eine Alternative, die Ladung config Bearbeitung ist -C target-feature=+crt-static passiert von Hand rustc.

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

Pull-Request: https://github.com/rust-lang/rust/pull/37545

Cargo-config: http://doc.crates.io/config.html