1

gnu gcc および stdc++ ライブラリ ビルドを変更および再コンパイルせずに、別の埋め込み soname を使用してこれらのライブラリの動的読み込みバージョンを再現できる必要があります。

私は賢く、利用可能な静的バージョンを使用して、次のようなもので再パッケージ化すると思いました。 ld -E -shared -static "-lstdc++" -lgcc -lgcc_eh -o librepackaged_standard.so

librepacked_standard.so は警告やエラーなしで作成されますが、ldd は動的ライブラリではないと報告し、readelf は次の基本的なシンボルのみを報告します。

Symbol table '.symtab' contains 4 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000201000     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
     2: 0000000000201000     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
     3: 0000000000201000     0 NOTYPE  GLOBAL DEFAULT  ABS _end

ld が静的に定義されたすべてのシンボルを取り込まない理由がわかりません。また、これを機能させるために指定する必要がある他の特別なパラメーターがあるかどうかもわかりません。

もう 1 つのオプションは、元の elf ライブラリに組み込まれている soname を単純に変更する既知のクロス プラットフォームの方法があるかどうかです。私は現在、エルフ形式のバイナリのみに関心があります。既存のバイナリの .soname を変更する独自のツールを作成することに興味はありません。

更新: シンボルがコンパイルされなかった理由はld、.o ファイルとは異なる方法で静的バイナリを処理するためです。デフォルトでは、リンク行の別のライブラリで必要とされない限り、.a ファイルからシンボルをインポートしません。--whole-archive オプションを指定して修正しました。

ただし、別のエラーが発生しますrelocation R_X86_64_32S against。_ZSt12_S_first_one' は、共有オブジェクトを作成するときに使用できません。-fPIC で再コンパイルすると、andシンボルを読み取れませんでした: 値が正しくありません` これらは両方とも、bitset.o アーカイブの libstdc++.a からのものです。したがって、.a を動的ライブラリに再コンパイルすることはできません。デフォルトでは、GNU GCC コンパイルは静的ライブラリに使用されるオブジェクト ファイルを PIC オプションでコンパイルしないためです。

そのため、elf ツールを見つけるか、ビルドを変更して GNU GCC を再コンパイルする必要があります。

回答の1つが述べたように、ライセンスの問題はこれらのアプローチのいずれかで懸念される可能性があります. 私の最良の答えは、要件を変更し、GCC 標準ライブラリの変更や再パッケージ化を一切伴わない別の解決策を見つける必要があるということです。

4

2 に答える 2

2

シンボルが共有ライブラリにコンパイルされなかった理由はld、.o ファイルとは異なる方法で静的バイナリを処理するためです。デフォルトでは、リンク行の別のライブラリで必要とされない限り、.a ファイルからシンボルをインポートしません。その特定の問題に対する答えは、 --whole-archive オプションを使用し、.a ファイルを直接リンクすることです。

ただし、これが機能するには、静的アーカイブに含まれる .o ファイルがコンパイル時に -fPIC オプションを使用してコンパイルされている必要があります。ただし、スタティック ライブラリに使用されるオブジェクト ファイルは、利用可能なスタティック ライブラリでそのオプションを使用してコンパイルされません。

したがって、SONAME を変更する解決策は、ELF バイナリ ユーティリティを使用するか、別の SONAME を使用するように変更された GNU GCC を再構築することです。

この状況ではライセンスの問題があるため、プロジェクトはオープン ソースではなく、すべてのプラットフォームで GNU GCC の修正されたソース バージョンを再配布する必要がないため、どのソリューションも実用的ではありません。

于 2011-10-18T20:31:49.113 に答える
1
  1. -staticおそらく元に戻しました-shared
  2. 古典的には、静的ライブラリからオブジェクト ファイルを抽出し、それらのオブジェクト ファイルを共有ライブラリにパッケージ化します。PIC (位置独立コード) の汎用的な使用に依存して、静的ライブラリ内のオブジェクトを安全に共有ライブラリ。その抽出ステップがなくてもできるかもしれませんが、私はそれを疑います.
  3. ライセンス条件を満たしているかどうかを検討することをお勧めします。
于 2011-10-18T01:55:41.740 に答える