2015-08-02 14 views
19

Tôi đang cố tạo một tệp thi hành tĩnh với Rust. Tôi đang không phải cố gắng liên kết tĩnh một thư viện cụ thể, tôi đang cố tạo một tệp thực thi mà không sử dụng liên kết động tại tất cả. Tôi có các thử nghiệm sau (nếu không làm việc):Làm cách nào để tạo các tệp thi hành được liên kết tĩnh?

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

Lưu ý dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2. Thay vào đó, các tệp thi hành tĩnh có statically linked. (Và trong trường hợp của tôi corrupted section header size, mặc dù tôi sẽ ngạc ngạc nhiên nếu tôi có thể thuyết phục Rust để tái tạo rằng.)

Những tùy chọn sao tôi cần phải vượt qua để rustc để có được nó để tạo ra một thực thi tĩnh thực tế (ví concreteness : một thậm chí file đồng ý được liên kết tĩnh).

+0

Có lẽ C liên kết-args = '...' tùy chọn có thể giúp bạn? – llogiq

+0

Lưu ý rằng câu hỏi của bạn chỉ liên quan đến Linux - AFAIK, [bạn không thể liên kết tĩnh các tệp thực thi trên OS X] (https://developer.apple.com/library/mac/qa/qa1118/_index.html). Tôi không chắc chắn về Windows. – Shepmaster

+3

Bạn có thể muốn xem [sử dụng musl thay vì glibc wih rust] (https://github.com/rust-lang/rust/pull/24777) –

Trả lời

14

Rust liên kết tĩnh mọi thứ trừ glibc (và libgcc, iirc) theo mặc định.

Nếu bạn muốn nhận được một tệp nhị phân được liên kết tĩnh 100%, bạn có thể sử dụng MUSL với 1.1. https://github.com/rust-lang/rust/pull/24777 là hỗ trợ ban đầu, chúng tôi hy vọng sẽ giúp bạn sử dụng dễ dàng hơn trong tương lai.

4

trường hợp sử dụng của tôi là thế này, tôi muốn tránh tình trạng rất phổ biến này trên cửa sổ:

Chương trình không thể bắt đầu vì VCRUNTIME140.dll là mất tích từ máy tính của bạn . Thử cài đặt lại chương trình để khắc phục sự cố này.

Giải pháp này hoạt động, nhưng hiện chỉ hoạt động vào đêm (2017-06-06). Thêm phần này vào .cargo/tập tin cấu hình của bạn (sử dụng mục tiêu thích hợp triple cho nền tảng của bạn):

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

Một thay thế cho việc chỉnh sửa cấu hình hàng hóa là để vượt qua -C target-feature=+crt-static để rustc bằng tay.

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

Kéo Yêu cầu: https://github.com/rust-lang/rust/pull/37545

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

Các vấn đề liên quan