1

次のコマンドについて考えてみます。

g++ -Wl,--start-group main.o liba.a -Wl,--end-group -o a.out

a.outに、liba.aで定義されているが、main.oでは使用されていないシンボルがある可能性はありますか?はいの場合、どのような場合ですか?これを可能にするために、ソースコードを記述したり、コンパイラやリンカを呼び出したりする際のトリックはありますか?私の知る限り、これは起こらないはずですが、最近そのようなケースに遭遇しました。

4

1 に答える 1

2

これが発生する可能性のある状況は、少なくとも3つ考えられます。

  1. -Wl,--whole-archive必要なオブジェクトファイルだけでなく、全体を強制的liba.aに含めるために使用できます。
  2. liba.aの内容をバイパスして、Cランタイムによって使用されるシンボルが含まれている可能性がありますmain.o。このようなシンボルの最も一般的な原因は、コンストラクターを使用したC++グローバルオブジェクトまたはファイルスコープオブジェクトです。
  3. デフォルトでは、リンカは未使用のコードを個々のオブジェクトファイルのスケールで削除します。オブジェクトファイルが、一部のみが使用されたシンボルの束を定義している場合、それらのすべては関係なく存在します。これを回避するには、関連するすべてのものを コンパイルしてliba.aから、リンク時-ffunction-sections -fdata-sectionsに提供します。-Wl,--gc-sectionsごく最近のGCC(4.7より前のものではこれを試しません)では、すべてをコンパイルして-fltoからリンクする-fwhole-programことも役立つ場合があります。
于 2012-12-27T21:57:20.713 に答える