2014-10-05 11 views
8

Tôi gặp sự cố khi xây dựng một tệp thực thi di động có bị rỉ sét.Các tệp nhị phân di động có Rust

Chạy một thực thi đơn giản là xây dựng với cargo build trên Ubuntu không thành công với

./test: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./test) 

Tòa nhà có rustc ... -C link-args=-static thất bại trong việc liên kết một cách chính xác (đầu ra của ld ./test):

ld: error in ./test(.eh_frame); no .eh_frame_hdr table will be created. 

Có một khoảng cách này trừ xây dựng trên một hệ thống cũ với một phiên bản glibc cũ?

+2

Bạn đang hỏi về mã nhị phân "xách tay", nhưng bạn chỉ có danh sách một hệ thống (Ubuntu) mà không cần bất kỳ thông tin phiên bản. Có nhiều hệ thống liên quan? Nếu vậy các bản phân phối và phiên bản của chúng là gì? – Shepmaster

Trả lời

3

Glibc không được liên kết tĩnh (nhiều như chúng tôi có thể đã thích, nó sẽ không hoạt động để ngăn chặn điều này). Kết quả là, các thư viện hệ thống (libstd và như vậy) luôn phụ thuộc vào phiên bản glibc mà chúng được xây dựng. Đây là lý do tại sao các buildbots trong cụm linux sử dụng mozilla là/là phiên bản cũ của centos.

Xem https://github.com/rust-lang/rust/issues/9545https://github.com/rust-lang/rust/issues/7283

Đáng tiếc là lúc này tôi tin rằng không có cách giải quyết một số tồn tại và đảm bảo bạn xây dựng trên một hệ thống với một glibc lớn tuổi hơn bạn đang đi để triển khai.

-1

Để tránh lỗi GLIBC, bạn có thể biên dịch phiên bản Rust của riêng bạn thành libc thay thế tĩnh, musl.

Lấy phiên bản ổn định mới nhất của musl và xây dựng nó với tùy chọn --disable-shared:

$ mkdir musldist 
$ PREFIX=$(pwd)/musldist 
$ ./configure --disable-shared --prefix=$PREFIX 

sau đó xây dựng Rust chống musl:

$ ./configure --target=x86_64-unknown-linux-musl --musl-root=$PREFIX --prefix=$PREFIX 

sau đó xây dựng dự án của bạn

$ echo 'fn main() { println!("Hello, world!"); }' > main.rs 
$ rustc --target=x86_64-unknown-linux-musl main.rs 
$ ldd main 
    not a dynamic executable 

Đối biết thêm thông tin, xem phần advanced linking của tài liệu.

Theo báo cáo trong các tài liệu gốc:

Tuy nhiên, bạn có thể cần phải biên dịch lại thư viện mẹ đẻ của bạn chống lại musl trước khi họ có thể liên kết chống lại.


Bạn cũng có thể sử dụng rustup.

Di Rust cũ được cài đặt bởi rustup.sh

$ sudo /usr/local/lib/rustlib/uninstall.sh # only if you have 
$ rm $HOME/.rustup 

Install rustup

$ curl https://sh.rustup.rs -sSf | sh 
$ rustup default nightly #just for ubuntu 14.04 (stable Rust 1.11.0 has linking issue) 
$ rustup target add x86_64-unknown-linux-musl 
$ export PATH=$HOME/.cargo/bin:$PATH 
$ cargo new --bin hello && cd hello 
$ cargo run --target=x86_64-unknown-linux-musl 
$ ldd target/x86_64-unknown-linux-musl/debug/hello 
    not a dynamic executable 
Các vấn đề liên quan