如何将一个 .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 非常精简。
不幸的是,有时我不得不调试这段代码,这让我发疯,因为它没有使用像 enum
s 这样简单的东西,它会在 .pdb
文件中放置符号来进行调试就是这么简单。
我很乐意将一些 #define
转换为 enum
,即使我还没有更改变量类型,但我真的担心它会导致如果要更改生成的代码,可能会出现性能方面的问题。
我需要明确地表明,编译后的代码不会发生任何变化,但看起来 .dll
实际上在 64 位构建中发生了显着变化。我查看了其中一个函数的反汇编代码,它似乎没有受到影响,但我需要展示二进制文件中发生了什么变化,什么没有发生变化,以减轻我同事的恐惧以及我自己的一些恐惧,加上作为为什么任何更改都会传播到 .dll
,尽管 .dll
大小相同。
有人知道我该怎么做吗?我试过使用 dumpbin
,但我不太熟悉它并且得到了一些混杂的结果,这可能是因为我对输出的理解不尽如人意。
我的做法如下:
- 为项目打开 /FAs 开关。
- 编译该项目。
- 移动目标文件目录(Release => Release-without-enums)
- 将#defines更改为enums
- 再次编译该项目。
- 移动目标文件目录(Release => Release-with-enums)
- 来自 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
只是为了让我可以看到每个文件的整个文件。如果您只想查看更改,请将其删除。
这将列出生成的汇编代码中的所有修改。
发现的变化如下:
- 符号地址显然无缘无故地移动了
- 引用 __FILE__ 似乎导致在使用枚举时无法获得完整路径。为什么这会转化为在使用枚举时删除完整路径是一个谜,因为编译器标志没有改变。
- 一些符号显然没有任何原因被重命名。
编辑
2 和 3 似乎是由损坏的 .pdb
错误引起的。这可能是由于文件在同一解决方案的多个项目中使用。重建整个解决方案解决了这 2 个问题。
我有一个 20+ 哟 .dll
,用 C 写的,none 的同事想要触摸。有充分的理由,它在任何地方都使用宏、宏常量和强制转换,使符号 table 非常精简。
不幸的是,有时我不得不调试这段代码,这让我发疯,因为它没有使用像 enum
s 这样简单的东西,它会在 .pdb
文件中放置符号来进行调试就是这么简单。
我很乐意将一些 #define
转换为 enum
,即使我还没有更改变量类型,但我真的担心它会导致如果要更改生成的代码,可能会出现性能方面的问题。
我需要明确地表明,编译后的代码不会发生任何变化,但看起来 .dll
实际上在 64 位构建中发生了显着变化。我查看了其中一个函数的反汇编代码,它似乎没有受到影响,但我需要展示二进制文件中发生了什么变化,什么没有发生变化,以减轻我同事的恐惧以及我自己的一些恐惧,加上作为为什么任何更改都会传播到 .dll
,尽管 .dll
大小相同。
有人知道我该怎么做吗?我试过使用 dumpbin
,但我不太熟悉它并且得到了一些混杂的结果,这可能是因为我对输出的理解不尽如人意。
我的做法如下:
- 为项目打开 /FAs 开关。
- 编译该项目。
- 移动目标文件目录(Release => Release-without-enums)
- 将#defines更改为enums
- 再次编译该项目。
- 移动目标文件目录(Release => Release-with-enums)
- 来自 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
只是为了让我可以看到每个文件的整个文件。如果您只想查看更改,请将其删除。
这将列出生成的汇编代码中的所有修改。
发现的变化如下:
- 符号地址显然无缘无故地移动了
- 引用 __FILE__ 似乎导致在使用枚举时无法获得完整路径。为什么这会转化为在使用枚举时删除完整路径是一个谜,因为编译器标志没有改变。
- 一些符号显然没有任何原因被重命名。
编辑
2 和 3 似乎是由损坏的 .pdb
错误引起的。这可能是由于文件在同一解决方案的多个项目中使用。重建整个解决方案解决了这 2 个问题。