2016-04-26 6 views
0

У меня есть 20+ лет .dll, написанный на C, который никто из моих коллег не хочет прикоснуться. По уважительной причине, он использует макросы, макроконстанты и кастинг EVERYWHERE, что делает таблицу символов довольно скудной.Как сравнить сегменты .text и .data .dll с теми же в другой .dll?

К сожалению, мне иногда приходится отлаживать этот код, и это сводит меня с ума, что он не использует что-то столь же простое, как enum s, которое помещает символы в файл .pdb, чтобы облегчить отладку.

Я хотел бы преобразовать некоторые из #define s в enum s, даже если я пока не изменяю типы переменных, но есть настоящий страх, что это вызовет возможные проблемы с точки зрения производительности, если бы это было для изменения генерируемого кода.

Мне нужно показать окончательно, что никаких скомпилированных изменений кода не произойдет, но похоже, что .dll существенно меняется в 64-битной сборке. Я посмотрел на один из кода разборки функции, и, похоже, он не затронут, но мне нужно показать, что есть и не меняется в двоичном коде, чтобы облегчить страхи моих коллег, а также некоторые из моих собственных трепетов, а также недоумение, как почему любые изменения распространяются на .dll вообще, хотя .dll s имеют одинаковый размер.

Кто-нибудь знает, как я могу это сделать? Я пытался использовать dumpbin, но я не знаком с этим, и я получаю некоторые смешанные результаты, потому что я не понимаю вывод так сильно, как мне нравится.

ответ

0

То, как я сделал это следующим образом:

  1. Включите / ТВС переключатель для проекта.
  2. Скомпилируйте этот проект.
  3. Переместите каталог объектный файл (Release =>релиз-без перечислений)
  4. Изменить #defines к Перечисления
  5. Заполнять этот проект снова.
  6. Переместите каталог объектного файла (Release =>релиз-с-перечисления)
  7. Из командной строки Баша. Используйте команду из родительского каталога выпуска:
for a in Release-without-enum/*.asm; do 
    git diff --no-index --word-diff --color -U10000 $a "Release-with-enum/$(basename $a)"; 
done | less -R 

-U10000 просто так, что я могу видеть весь файл каждого файла. Удалите его, если вы просто хотите увидеть изменения.

В нем будут перечислены все изменения в сгенерированном ассемблерном коде.

Изменения найдено было следующим:

  1. Символа адрес был передвигалось по-видимому без причины
  2. REFERENCING __FILE__, кажется, в результате не получить полный путь при использовании перечислений. Почему это приведет к удалению полного пути, когда использование перечислений является загадкой, поскольку флаги компилятора не изменились.
  3. Некоторые символы были переименованы, по-видимому, без причины.

Редактировать

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

 Смежные вопросы

  • Нет связанных вопросов^_^