グローバルシンボルテーブルへのシンボルのエクスポートを制限する方法を誰か提案してもらえますか?
前もって感謝します
やあ、
返信ありがとうございます...
実際には、「ver1.a」というサードパーティのライブラリに静的にリンクされている実行可能ファイルがあり、同じライブラリにリンクされているサードパーティの「.so」ファイルも使用していますが、バージョンは「ver2.a」と呼ばれています。問題は、これらの両方のバージョンの実装が異なることです。最初に、実行可能ファイルが読み込まれると、「ver1.a」のシンボルがグローバル シンボル テーブルにエクスポートされます。「.so」がロードされるたびに、ver2.a からのシンボルを参照しようとし、以前にロードされた「ver1.a」からのシンボルを参照することになります。したがって、バイナリがクラッシュします。
実行可能ファイルのシンボルをグローバル シンボル テーブルにエクスポートしないという解決策を考えました。そのため、「.so」がロードされて ver2.a のシンボルを使用しようとすると、グローバル シンボル テーブルで見つからず、そのシンボルを使用します。独自のシンボル、つまり ver2.a のシンボル
シンボルのグローバル シンボル テーブルへのエクスポートを制限する方法が見つかりません。--version-scriptとretain-symbol-fileで試してみましたが、うまくいきませんでした。-fvisibility=hidden オプションの場合、「 -f オプションは -shared でのみ使用できる」というエラーが表示されます。したがって、これも「--version-script」のように、実行可能バイナリではなく共有ライブラリに対してのみ機能すると思います。
コードは c++、OS-Linux、gcc バージョン 3.2 です。サードパーティのライブラリと「.so」を再コンパイルできない場合があります。したがって、「so」ファイルを bsymbolic フラグで再コンパイルするオプションは除外されます。
どんな助けでも大歓迎です。