Unix/Linux/OSX システムでは、次のようにします。
for eachfile in *.exe *.dll ; do
nm $eachfile | sort | uniq > $eachfile.symbols.txt
done
cat *.symbols.txt | sort | uniq -c > count-duplicate-symbols.txt
sort -r count-duplicate-symbols.txt | less
最初の 3 行は、「現在のディレクトリにある各 .exe および .dll ファイルからシンボルをダンプします。各ダンプを別のファイルに保存します。ちなみに、同じ行が 1 つのファイルに複数回表示される場合は、そのまま保存してください。一度。"
で始まる行は、「作成したばかりのすべてcat
のファイルで各行が出現する回数を数えます。重複した行とその数を含むという名前の新しいファイルを書き込みます。」count-duplicate-symbols.txt
最後の行には、「このファイルを重複の数で (昇順で) 並べ替え、読み取れるように端末にパイプする」と書かれています。
どのソース ファイルに問題のある重複シンボルが含まれているかを確認したい場合はgrep
、そのために使用できます。
このアプローチは、おそらくstatic
シンボル (関数と変数) に対しては機能しないことに注意してください。また、どこにでも現れるはずのインライン関数などに対して誤検出を引き起こす可能性があることに注意してください。linkonce セクションに表示されるシンボルを除外したり、出力を でプリティプリントしたりできますc++filt
。
これらのツールの一部は、Windows で確実に利用できます。それらがすべてかどうかはわかりません。