Анализ разделяемых библиотек на предмет дублирования кода

У нас есть большая кодовая база с> 40 проектами (на языке VS), создающими несколько DLL / SO (~ 15) и EXE.

Есть несколько утилитных проектов, которые статически связаны для создания EXE и также используются большинством DLL. В идеале, мы бы хотели, чтобы эти служебные проекты тоже были библиотеками DLL, чтобы код не дублировался в каждой из библиотек DLL, которые зависят от них.

Существуют ли какие-либо инструменты для бинарного анализа библиотек DLL, чтобы увидеть, сколько существует дублирования (код + данные)? Получение оценки по этому поможет.

2

Решение

Ну, в системе 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

В первых трех строках написано: «Извлекайте символы из каждого файла .exe и .dll в текущем каталоге; сохраняйте каждый дамп в отдельном файле. Кстати, если одна и та же строка появляется несколько раз в одном файле, просто сохраните ее один раз.»

Строка, начинающаяся с cat говорит: «Посчитайте, сколько раз каждая строка встречается все файлы, которые мы только что произвели. Написать новый файл с именем count-duplicate-symbols.txt который содержит дублированные строки с их количеством. «

Последняя строка говорит «Сортировка этот файл по количеству дубликатов (в порядке возрастания) и направить его к терминалу, чтобы я мог прочитать его. «

Если вы хотите увидеть, какие исходные файлы содержат дублирующиеся символы, которые могут вас обидеть, вы можете использовать grep для этого.

Обратите внимание, что этот подход, вероятно, не будет работать для static символы (функции и переменные), и это может давать ложные срабатывания для таких вещей, как встроенные функции, которые должны появляться повсюду. Вы можете отфильтровать символы, появляющиеся в разделах linkonce, распечатав вывод c++filtи т. д. и т. д.

Некоторые из этих инструментов, безусловно, доступны для Windows. Я не знаю, все ли они.

1

Другие решения

Никаких инструментов, только один между вашими ушами. Вы хотите сосредоточиться на проектах, которые связывают статическую библиотеку, найти те, где одна и та же статическая библиотека используется более одного раза. Это отправная точка для предположения, что функция может быть связана более одного раза.

Затем вы можете использовать опцию компоновщика / VERBOSE, которая показывает, какие функции связаны со статической библиотекой. Из этой опции есть много выходных данных, однако она краткая и легко анализируется.

В качестве альтернативы рассмотрите возможность использования опции компоновщика / MAP для создания файла .map. Который подробно показывает, какие функции были связаны с конечным исполняемым файлом. Наличие одной и той же функции более одного раза в разных файлах .map — это ваш пример того, что было бы целесообразно вместо этого поместить ее в DLL. Возможно написать небольшую программу на вашем любимом языке сценариев, которая обрабатывает выходные данные / VERBOSE или файлы .map и находит совпадения.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector