/ / lust、static-linked、rust、rust-cargoによるポータブルバイナリ

Rust - ld、静的リンク、錆、錆びた貨物を持つポータブルバイナリ

錆びたポータブル実行ファイルを作成するのに問題があります。

単純に構築された実行ファイルを実行する cargo build Ubuntuで失敗する

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

ビルドする rustc ... -C link-args=-static 正しくリンクできません(の出力 ld ./test):

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

古いglibcバージョンを持つ古いシステム上に構築する以外に、これを回避する方法はありますか?

回答:

回答№1の場合は3

Glibcは静的にリンクされていません。好きだった、それはこれを防ぐために邪魔になります)。結果として、システムライブラリ(libstdなど)は常にそれらが構築されたglibcのバージョンに依存します。これが、mozillaが使用しているLinuxクラスタ内のビルドボットがセントバージョンの古いバージョンであった理由です。

見る https://github.com/rust-lang/rust/issues/9545 そして https://github.com/rust-lang/rust/issues/7283

残念ながら、現時点では、デプロイしようとしているよりも古いglibcを持つシステム上でビルドすることを確認する以外に回避策はないと思います。


回答№2の場合は-1

GLIBCエラーを回避するために、静的代替libcに対してRustのあなた自身のバージョンをコンパイルすることができます。 ムスル.

muslの最新の安定版を入手してオプションでビルドする --disable-shared

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

それからmuslに対してRustを構築します。

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

それからあなたのプロジェクトを構築します

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

詳細については、 高度なリンク ドキュメントのセクションを参照してください。

元のドキュメントで報告されているように、

しかし、あなたはmuslに対してあなたのネイティブライブラリを再コンパイルする必要があるかもしれません。 それらがリンクされる前に。


あなたも使用することができます さび.

rustup.shによってインストールされた古いRustを削除します。

$ sudo /usr/local/lib/rustlib/uninstall.sh # only if you have
$ rm $HOME/.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