2011-10-17 18 views
1

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

答えて

2

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

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

したがって、SONAMEを変更するには、ELFバイナリユーティリティを使用するか、別のSONAMEを使用するように変更したGNU GCCを再構築する必要があります。

このような状況ではライセンスの問題があるため、オープンソースではないため、すべてのプラットフォームでGNU GCCのソースコードを再配布する必要はありません。

1
  1. -staticはおそらく-sharedをundidします。
  2. 古典的には、静的ライブラリからオブジェクトファイルを抽出し、その静的ライブラリ内のオブジェクトが安全にできるように、PIC(位置非依存コード)の普遍的な使用に依存するそれらのオブジェクトファイルを共有ライブラリにパッケージ化します共有ライブラリに変換することができます。あなたはその抜粋のステップを取ることなくできるかもしれないが、私はそれを疑う。
  3. ライセンスの利用規約を満たしているかどうかについて考える必要があります。
+0

ldのmanページは、-staticの状態を示しています。共有ライブラリをリンクしません。 このオプションをコマンドラインで複数回使用することができます。これは、それに続く-lオプションのライブラリ検索に影響します。 このオプションは、-sharedとともに使用できます。そうすることは、共有ライブラリが作成されていることを意味しますが、静的ライブラリからエントリを取り込むことによって、ライブラリのすべての外部参照を解決する必要があります。 – James

+0

ライセンスに関して言えば、それは私に要件を与えてくれる人々にとっては良い点です。私は、最善の選択肢は、サポートされているプラ​​ットフォームにインストールされているstdC++ライブラリパッケージの最小限のバージョンを必要とすることを彼らに納得させようとしています。AFAIKはソフトウェアの一般的なプラクティスです。 – James

関連する問題