2

40 を超えるプロジェクト (VS 用語で) を含む大規模なコードベースがあり、いくつかの DLL/SO (~15) と EXE を作成しています。

EXE を作成するために静的にリンクされ、ほとんどの DLL でも使用されるいくつかのユーティリティ プロジェクトがあります。理想的には、これらのユーティリティ プロジェクトも DLL にする必要があるため、それらに依存する各 DLL でコードが重複することはありません。

DLL でバイナリ分析を実行して、重複がどの程度存在するか (コード + データ) を確認するツールはありますか? これについての見積もりを取得すると役立ちます。

4

2 に答える 2

1

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 で確実に利用できます。それらがすべてかどうかはわかりません。

于 2013-10-25T00:35:12.933 に答える