2012-05-11 6 views
1

私はC++実行ファイルを構築しています。私は静的に私が使っているCとC++のライブラリのいくつかをリンクしています。しかし、私は使用しているすべてのライブラリを静的にリンクしているわけではありません。実行ファイルの.dynstrに、静的リンクライブラリのシンボルが含まれているのはなぜですか?

実行可能ファイルは異常に大きいようです。私はobjdump -hを使用しました。これは私が予想していたよりもはるかに多くのスペースを.dynstrで使用していると言いました。私は-Osしてコンパイルし、stripを実行しますが、私は

$ readelf -p .dynstr slamshift 

を実行したときに、私は静的にリンクしたライブラリ(自分のライブラリ、内のシンボルのための

[ 13588] _ZN3yuu6windowC2Ev 
    [ 1359b] _ZTSN3yuu7gfx_ctxE 
    [ 135ae] _ZN4YAML7Scanner11ScanFlowEndEv 
    [ 135ce] __glewVertexFormatNV 

のように多くのエントリを取得しましたyaml- cpp、およびGLEW)。

なぜこれらのシンボルが実行ファイルに表示されますか?関係するライブラリを静的にリンクした場合、シンボル名は不要であるべきですか?

私はUbuntu 12.04、GCC 4.6.3、CMakeとそのデフォルト設定を使用してビルドしています(該当する場合)。

答えて

3

をこれらのシンボルは私の実行中に出現しているのはなぜ?

これらのシンボル実行可能ファイルからエクスポートし、ダイナミックシンボルテーブルに表示されるための唯一の2つの理由があります。

  1. あなたは、リンクに参加して他のいくつかの共有ライブラリがこれらのシンボルを参照する--export-dynamic(別名-E)リンカ・フラグを使用して実行可能ファイルをリンクし、または

#1を実行している場合、答えは簡単です。それはしないでください。

#2のためにシンボルがエクスポートされている場合は、実際にシンボルをエクスポートする必要があります。そうしないと、コードが他の場所で失敗する可能性があります。

+0

実際問題は、デフォルトで-rdynamicを含むCMakeであることが判明し、他のほとんどのリンカーフラグよりも明らかに優先されます。 –

1

ELF実行ファイルをdl_openやフレンドを使用して動的オブジェクトとして開くことは、ほとんど知られていません。そのためにはシンボルのエクスポートが必要です。私はそれがここで起こっていると思います。

--exclude-libs ALLを使用してリンカーに最終的なプログラムリンクを試すことができます。 gccコマンドラインでは-Wl,--exclude-libs ALLのようになります。
更新:シンボルはまだ存在しますが、非表示とマークされます。

また、-Wl,--exclude-all-symbolsを試してみることもできます。
更新:私はこれについて間違っていました。それはPEターゲットのためだけです。

は、私はこれを試してみました、それが働いた:
gcc -static -Wl,-s export-test.c

関連する問題