On 'C'、Linux、スタティックにリンクするには静的ライブラリが必要ですか?
スタティックにリンクするには静的ライブラリが必要ですか、それとも十分ですか? そうでない場合は、どうしてですか? (同じデータを含んでいないのですか?)
On 'C'、Linux、スタティックにリンクするには静的ライブラリが必要ですか?
スタティックにリンクするには静的ライブラリが必要ですか、それとも十分ですか? そうでない場合は、どうしてですか? (同じデータを含んでいないのですか?)
はい、静的にリンクされた実行可能ファイルをビルドするには、静的ライブラリが必要です。
スタティックライブラリは、コンパイルされたオブジェクトのバンドルです。静的にライブラリにリンクすると、そのライブラリのコンパイル結果を取得し、現在のプロジェクトで解凍し、自分のオブジェクトであるかのように使用することと事実上同じです。
ダイナミックライブラリは既にリンクされています。これは、再配置のようないくつかの情報がすでに修正されて投げ捨てられていることを意味します。
さらに、ダイナミックライブラリは、位置に依存しないコードとしてコンパイルする必要があります。これは静的ライブラリの制限ではなく、いくつかの一般的なプラットフォーム(x86など)でパフォーマンスに大きな違いが生じます。
動的リンクされた実行可能ファイルに動的リンクされたライブラリをバンドルしようとするツールがありますが、すべての状況で正しく動作する結果を生成することは非常に困難です。
静的コンパイルのようなものはなく、静的リンクのみです。そしてそのためには、静的ライブラリが必要です。静的リンクと動的リンクの違いは、前者ではリンク時(コンパイル時の直後)に名前が解決され、後者ではプログラムが実行を開始すると解決されます。
スタティックライブラリとダイナミックライブラリには、多くの要因によって同じ情報が含まれる場合と含まれない場合があります。静的または動的にコードをリンクするかどうかの決定は重要なものであり、しばしばアプリケーションのアーキテクチャに影響します。
「コンパイル」を「リンク」に修正しました。 –
静的にリンクされたプログラムにリンクするすべてのライブラリは、静的なバリアントでなければなりません。動的(libfoo.so)ライブラリと静的(libfoo.a)ライブラリは同じ関数を持っていますが、それらは異なる書式ファイルなので、プログラムに合った型が必要です。
すばらしい答えをありがとう。しかし、なぜそれはとても難しいのですか? –
ELF Statfierは、実行可能ファイルとそのすべてのライブラリをロードし、プロセスメモリのスナップショットを取得します。出力イメージが実行されると、メモリレイアウトが変更されるようなもの(例えば、ランダム化されたVDSO)は、誤った動作を引き起こします。他の方法では、ダイナミックリンカを再発明する必要があります。 – ephemient
ダイナミックリンカーを再実装するのはなぜ難しいでしょうか?図書館の輸入と輸出の2つのテーブルだけが再配置されるのではないか?これはリンカであり、すでにスタティックリンカを実装しており、実行可能ファイルとダイナミックライブラリなどのファイル形式を知っています。 – ChrisW