如何将一个 .dll 的 .text 和 .data 段与另一个 .dll 中的相同段进行比较?

How can I compare .text and .data segments of a .dll against the same ones in a different .dll?

我有一个 20+ 哟 .dll,用 C 写的,none 的同事想要触摸。有充分的理由,它在任何地方都使用宏、宏常量和强制转换,使符号 table 非常精简。

不幸的是,有时我不得不调试这段代码,这让我发疯,因为它没有使用像 enums 这样简单的东西,它会在 .pdb 文件中放置符号来进行调试就是这么简单。

我很乐意将一些 #define 转换为 enum,即使我还没有更改变量类型,但我真的担心它会导致如果要更改生成的代码,可能会出现性能方面的问题。

我需要明确地表明,编译后的代码不会发生任何变化,但看起来 .dll 实际上在 64 位构建中发生了显着变化。我查看了其中一个函数的反汇编代码,它似乎没有受到影响,但我需要展示二进制文件中发生了什么变化,什么没有发生变化,以减轻我同事的恐惧以及我自己的一些恐惧,加上作为为什么任何更改都会传播到 .dll,尽管 .dll 大小相同。

有人知道我该怎么做吗?我试过使用 dumpbin,但我不太熟悉它并且得到了一些混杂的结果,这可能是因为我对输出的理解不尽如人意。

我的做法如下:

  1. 为项目打开 /FAs 开关。
  2. 编译该项目。
  3. 移动目标文件目录(Release => Release-without-enums)
  4. #defines更改为enums
  5. 再次编译该项目。
  6. 移动目标文件目录(Release => Release-with-enums)
  7. 来自 bash 命令行。使用来自 Release 目录父级的命令:
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. 引用 __FILE__ 似乎导致在使用枚举时无法获得完整路径。为什么这会转化为在使用枚举时删除完整路径是一个谜,因为编译器标志没有改变。
  3. 一些符号显然没有任何原因被重命名。

编辑

2 和 3 似乎是由损坏的 .pdb 错误引起的。这可能是由于文件在同一解决方案的多个项目中使用。重建整个解决方案解决了这 2 个问题。