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

时间:2016-04-26 22:47:05

标签: visual-studio visual-c++ dll enums visual-studio-macros

我有一个20多岁的.dll,用C语言编写,我的同事都不想触摸。有充分的理由,它使用宏,宏常量和无处不在的铸造,使符号表非常精简。

不幸的是,我有时必须调试这段代码,这让我很生气,因为它没有使用像enum那样简单的东西,它会将符号放在.pdb文件中以便进行调试更容易一点。

我很乐意将部分#define转换为enum s,即使我尚未更改变量类型,但我们真的担心它会导致可能的问题在性能方面,如果要改变生成的代码。

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

有谁知道我怎么能这样做?我曾尝试使用dumpbin,但我对它并不熟悉并且得到了一些混合的结果,因为我不像我喜欢的那样理解输出。

1 个答案:

答案 0 :(得分:0)

我这样做的方式如下:

  1. 启用项目的 / FAs 开关。
  2. 编译该项目。
  3. 移动目标文件目录(发布 => Release-without-enums
  4. #defines 更改为枚举
  5. 再次编译该项目。
  6. 移动目标文件目录(发布 => 发布 - 使用枚举
  7. 来自bash命令行。使用Release目录的父命令:
  8. 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. 有些符号因为没有理由而被重命名。
    4. 修改

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