理解Delphi MAP文件

13

这是我测试项目的MAP文件样例...

.......
 .......
 .......
 0001:001EFC14 00000020 C=CODE     S=.text    G=(none)   M=Vcl.CategoryButtons ACBP=A9
 0001:001EFC34 0000284C C=CODE     S=.text    G=(none)   M=Vcl.SysStyles ACBP=A9
 0001:001F2480 000407A8 C=CODE     S=.text    G=(none)   M=Vcl.Styles ACBP=A9
 0001:00232C28 00006998 C=CODE     S=.text    G=(none)   M=MainU ACBP=A9
 0002:00000000 000000B4 C=ICODE    S=.itext   G=(none)   M=System   ACBP=A9
 0002:000000B4 00000008 C=ICODE    S=.itext   G=(none)   M=SysInit  ACBP=A9
 ..... 
 .....

我的单元(MainU)驻留在00232C28到00006998。到这里为止,内存地址前缀是0001。从下一个单元开始,它以0002开头,以此类推。

这是什么意思?

另外,“C=”,“S=”,“G=”,“M=”和“ACBP =”是什么意思?


很棒的问题。欢迎来到StackOverflow,希望你在这里玩得开心。 - Warren P
3个回答

15

格式如下:
SegmentId:StartAddress Length C=SegmentClass S=SegmentName G=SegmentGroup M=ModuleName

ACBP 与对齐有关,但我无法告诉您这些十六进制数的含义。

C=CODE:代码段
C=ICODE:初始化代码段
C=DATA:(已初始化)数据段
C=BSS:(未初始化)数据段
C=TLS:线程本地存储

G=(none):无片段组


8
这意味着你的单元MainU的汇编代码从地址$00232C28开始,已编译单元的长度为$00006998字节。
段类(C =)是CODE,在映射文件开头定义。
段名称(S =)是.text 段组(G =)为none。
段模块(M =)是MainU ACBP属性= A9表示:
  • 未命名的内存地址空间绝对部分
  • 公共组合
  • 该段可能大于64K
还请参阅: http://files.mpoli.fi/unpacked/software/programm/general/ss0288.zip/ss0288_4.txt

1
根据这个Embarcadero docwiki页面,A、C和B分别代表对齐(Alignment)、组合(Combination)和“大”(Big)。但该页面似乎没有解释P的含义。十六进制值是掩码,尽管我认为它没有列出所有值。(例如,列出的值不允许存在奇数值)

对齐

  • 00 - 绝对段
  • 20 - 按字节对齐的段
  • 40 - 按字对齐的段
  • 60 - 按段对齐的段
  • 80 - 按页对齐的段
  • A0 - 未命名的存储绝对部分

组合

  • 00 - 不能组合
  • 08 - 公共组合段

大(16位)

  • 00 - 段小于64K
  • 02 - 段正好为64K

@GJ链接的文档描述了A、C、B的含义,以及P的含义(如果我理解正确的话,对于16位来说是0,对于32位来说是1)。因此,奇数值是Delphi 2到当前Delphi生成的有效值。我不知道64位exe如何标记。通常,在发布自己的答案之前,阅读其他人已经回答的内容是很好的避免重复回答的方法。 - Tom Brunberg
话虽如此,由于链接的文档未来可能无法访问,在您的回答中公开它可能会有益。 - Tom Brunberg
是的,后来我注意到@GJ链接的文档提供了更详细的信息。起初,我认为回复只回答了A9值的含义,而没有回答ACBP是什么的问题。我自己也在想这个问题,当我找到这个链接时,我想分享一下。也许我有点过于急于取悦 :) - Tim Veldhuizen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接