2

実行可能なelfファイルを動的にリンクすると、libc.so.6共有ライブラリが必要になります。実行可能なelfファイルを静的にリンクすると、libc.so.6共有ライブラリは必要ありません(驚くことではありません)。

--static で実行ファイルをアセンブルすると、リンカはその中に libc.so.6 をインクルードするということですか? そうでない場合 - リンカーにはどのファイルが含まれていますか? どこで検索できますか?私の知る限り、リンカーは静的にアセンブルされたファイルに静的ライブラリを含めます。

4

2 に答える 2

2

スタティックとしてリンクすると、リンカは必要なすべてのオブジェクト ( .o) ファイルをスタティック ライブラリ ( .a) からリンクします。たとえば、次のコマンドは、libc6 ライブラリに含まれるオブジェクト ファイルを一覧表示します。

ar t /usr/lib/libc.a

(もちろん、libc.a への正確なパスはシステムによって異なります)

したがって、あなたの質問に対する答えはノーです。libc6 ライブラリ全体をリンクするのではなく、必要なオブジェクト ファイルのみをリンクします。libc.so.6また、これは動的リンク専用であるため、 では何もしません。libc.aライブラリの静的バージョンで動作します。

@janneb のコメントによると、リンクする最小単位は「セクション」なので、オブジェクト ファイル全体をリンクする必要さえないかもしれません。

于 2012-04-23T07:35:20.663 に答える
1

リンカーはldコマンドです。そのコマンドを使用すると、要求したとおりに実行されます。GNUはスクリプトldを受け入れることができることに注意してください

ただし、ほとんどの人はgccコマンドを使用しています。これは、Gnu Compiler Collectionスイートのコンパイラです。実際には、このgccコマンドは単なるドライバー プログラムであり、cc1(適切な C コンパイラー)、asおよびldcollect2 (初期化などを処理し、リンカーを呼び出します) を実行します。

実行中の正確なコマンドを理解するには、プログラム フラグgccを渡します。-v

に渡す-staticgcc、おそらくeg/usr/lib/x86_64-linux-gnu/libc.aまたはGNU Libcライブラリの他の静的形式とリンクします。

于 2012-04-23T07:29:38.830 に答える