验证'*.map'文件是否与Delphi应用程序匹配

Tri*_*enT 3 delphi mapping executable

对于我的程序delphi-code-coverage-wizard,我需要验证(详细的)映射文件是否.map Delphi应用程序匹配.exe

当然,这个验证应该用Delphi来实现.
有办法检查吗?也许通过验证来自EXE的一些信息?

Dav*_*nan 9

我认为一个非常简单的启发式方法是检查PE文件中的各个部分是否在同一个地方开始和结束:

例如,这是地图文件的顶部.

 Start         Length     Name                   Class
 0001:00401000 000A4938H .text                   CODE
 0002:004A6000 00000C9CH .itext                  ICODE
 0003:004A7000 000022B8H .data                   DATA
 0004:004AA000 000052ACH .bss                    BSS
 0005:00000000 0000003CH .tls                    TLS
Run Code Online (Sandbox Code Playgroud)

我还看了dumpbin /headers一下这些部分的内容:

SECTION HEADER #1
   .text name
   A4938 virtual size
    1000 virtual address (00401000 to 004A5937)
   A4A00 size of raw data
     400 file pointer to raw data (00000400 to 000A4DFF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

SECTION HEADER #2
  .itext name
     C9C virtual size
   A6000 virtual address (004A6000 to 004A6C9B)
     E00 size of raw data
   A4E00 file pointer to raw data (000A4E00 to 000A5BFF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

...truncated
Run Code Online (Sandbox Code Playgroud)

看看.text部分.根据dumpbin,它开始于00401000并完成,004A5937其长度000A4938与.map文件完全相同.当然,您直接读取PE文件而不是运行dumpbin,但这说明了这一点.

我希望通过这种方法可以获得极少数的误报.