-symbolicと-shared GCCフラグの違いは何ですか?
-
22-09-2019 - |
質問
ドキュメントの記述から、彼らは「唯一のいくつかのシステムは、」(これらはシステムの同じセットであれば、それは不明だ)シンボリックサポートサポートが共有する「いないすべてのシステム」を除いて同じことを行うように見えると
-shared その後に他のオブジェクトとリンクすることができ、共有オブジェクトを生成します 実行可能ファイルを形成します。いないすべてのシステム このオプションをサポートしています。予測可能なため その結果、あなたも指定する必要があります。 に使用されたオプションの同じセット コードを生成する(-fpic、-fPIC、またはモデル これを指定するサブオプション) オプション1]
-symbolic グローバルシンボルにバインド参照共有オブジェクトを構築します。警告します 任意の未解決の参照について (リンクエディタによって上書きされない限り オプション-Xlinker -z -Xlinker defsオプション)。 ごく少数のシステムがこの機能をサポート オプションます。
私は違いが一部が、任意のライブラリーの真のである何かのような音ということ「そして、実行ファイルを形成するために、他のオブジェクトとリンクすることができる共有オブジェクトを生成」であると思います。それは結果の共有オブジェクトを静的にあまりにもリンクできることを意味するのでしょうか?
解決
概要:-symbolic防止内の共有オブジェクト関数介在
共有オブジェクトとのリンクは、シンボルの介在と呼ばれる機能が可能になります。アイデアは、それが「通常の」の定義ではなく、その後呼び出されるように、あなたがグローバルシンボルの新しい定義を「挟み込む」ことができるということです。
一つの古典的な例)(malloc関数です。最も一般的なケースでは、malloc関数は、()のlibc内で定義されています。しかし、あなたはライブラリをロードすることによって、malloc関数の独自のバージョンを挿入できるように定義しますが、libcのロード前に記号(ほとんどの実行時リンカーは、実行可能ファイルの前負荷に特定のライブラリへのLD_PRELOADを使用することができます)という。
はデフォルトでは、静的ではない共有オブジェクト内の任意の関数がグローバルシンボルです。そのため、共有オブジェクト内の任意の機能は、上で介在させることができます。共有オブジェクトは、それの実装の一部ともないHIGH_LEVEL()もlow_level()静的関数であるとして機能HIGH_LEVEL()とlow_level()とHIGH_LEVELを()low_level()を呼び出しているシナリオを考えてみましょう。
それはインターポーザlow_levelすることが可能です()ようにHIGH_LEVEL()別の共有オブジェクトからlow_level()を呼び出すされます。
この-symbolicの出番です。あなたの共有オブジェクトを作成する場合、リンカは(そのlow_levelが表示されますが)(HIGH_LEVELと同じ共有オブジェクトに定義されている)と結合し、それが上に介在することができないようにコール。この方法で、あなたは同じ共有オブジェクト内の別の共有オブジェクト内の1つの関数からの呼び出しが上に介在されないことを知っています。