9

ドキュメントの説明から、「すべてのシステムではなく」共有をサポートし、「一部のシステムのみ」がシンボリックをサポートすることを除いて、それらは同じことをしているようです(これらが同じシステムのセットであるかどうかは不明です):

-shared 他のオブジェクトとリンクして実行可能ファイルを形成できる共有オブジェクトを生成します。すべてのシステムがこのオプションをサポートしているわけではありません。予測可能な結果を​​得るには、このオプションを指定するときに、コードの生成に使用されたのと同じ一連のオプション (-fpic、-fPIC、またはモデル サブオプション) も指定する必要があります。[1]

-symbolic 共有オブジェクトを構築するときに参照をグローバル シンボルにバインドします。未解決の参照について警告します (リンク エディター オプション -Xlinker -z -Xlinker defs によってオーバーライドされない限り)。このオプションをサポートするシステムはごくわずかです。

違いは「他のオブジェクトとリンクして実行可能ファイルを形成できる共有オブジェクトを生成する」部分にあると思いますが、それはどのライブラリにも当てはまるように思えます。結果の共有オブジェクトも静的にリンクできるということですか?

4

1 に答える 1

8

要約: -symbolic は、共有オブジェクト内関数の介入を防ぎます

共有オブジェクトとのリンクにより、シンボル挿入と呼ばれる機能が可能になります。アイデアは、「通常の」定義ではなく呼び出されるように、グローバルシンボルの新しい定義を「挿入」できるということです。

古典的な例の 1 つが malloc() です。最も一般的なケースでは、malloc() は libc 内で定義されています。ただし、libc をロードする前にそのシンボルを定義するライブラリをロードすることにより、独自のバージョンの malloc を挿入できます (ほとんどの実行時リンカーでは、特定のライブラリに LD_PRELOAD を使用して、実行可能ファイルの前にロードできます)。

デフォルトでは、静的ではない共有オブジェクト内の関数はすべてグローバル シンボルです。そのため、共有オブジェクト内の任意の関数を介在させることができます。共有オブジェクトに関数 high_level() と low_level() があり、high_level() がその実装の一部として low_level() を呼び出し、high_level() も low_level() も静的関数ではないシナリオを考えてみましょう。

high_level() が別の共有オブジェクトから low_level() を呼び出すように、low_level() を挿入することができます。

これが -symbolic の出番です。共有オブジェクトを作成するとき、リンカは low_level() が high_level() と同じ共有オブジェクトで定義されていることを確認し、介入できないように呼び出しをバインドします。このようにして、共有オブジェクト内の 1 つの関数から同じ共有オブジェクト内の別の関数への呼び出しが介入されないことがわかります。

于 2009-10-20T00:36:22.907 に答える