gnu gccとstdC++ライブラリのビルドを変更したり再コンパイルすることなく、別の埋め込みsonameを持つライブラリの動的ロードバージョンを再現できるようにする必要があります。gnu gcc標準ライブラリstdC++、gcc、およびgcc_ehはどのように再パッケージ化されますか?
は、私は賢いこと、利用可能な静的なバージョンを使用してこのようなものでそれらを再パッケージだろうと思った:警告またはエラーなしで、 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を単純に変更するための既知のクロスプラットフォームの方法がある場合です。私は現在elfでフォーマットされたバイナリだけに関心があります。私は既存のバイナリの.sonameを変更する独自のツールを書くことには興味がありません。
更新: ld
は、.oファイルとは異なる静的バイナリを扱うため、シンボルがコンパイルされていないのが原因です。デフォルトでは、リンク行の別のライブラリで必要とされない限り、.aファイルからシンボルをインポートしません。私はそれを--whole-archiveオプションを指定して修正しました。
しかし、これは私に別のエラーを与えます。relocation R_X86_64_32S against
_ZSt12_S_first_one 'は共有オブジェクトを作成するときには使用できません。 -fPICで再コンパイルすると、and
シンボルを読み取ることができませんでした:不正な値 `両方ともlibetdC++。aのbitset.oアーカイブにあります。だから、GNU GCCコンパイルは、デフォルトでPICオプションを使って静的ライブラリに使われているオブジェクトファイルをコンパイルしないので、.aをダイナミックライブラリに再コンパイルすることはできません。
それで、私はelfツールを見つけたり、GNU GCCをビルドに変更して再コンパイルしたりしています。
答えの1つに記載されているように、ライセンスの問題はこれらのアプローチのいずれかで懸念される可能性があります。私の最善の答えは、私たちの要件に変更し、GCC標準ライブラリの変更や再パッケージ化を含まない別の解決策を見つける必要があるということです。
ldのmanページは、-staticの状態を示しています。共有ライブラリをリンクしません。このオプションをコマンドラインで複数回使用することができます。これは、それに続く-lオプションのライブラリ検索に影響します。 このオプションは、-sharedとともに使用できます。そうすることは、共有ライブラリが作成されていることを意味しますが、静的ライブラリからエントリを取り込むことによって、ライブラリのすべての外部参照を解決する必要があります。 –
James
ライセンスに関して言えば、それは私に要件を与えてくれる人々にとっては良い点です。私は、最善の選択肢は、サポートされているプラットフォームにインストールされているstdC++ライブラリパッケージの最小限のバージョンを必要とすることを彼らに納得させようとしています。AFAIKはソフトウェアの一般的なプラクティスです。 – James