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 標準ライブラリの変更や再パッケージ化を一切伴わない別の解決策を見つける必要があるということです。