Delphi Map文件中的双点 .. 是什么意思?

7

我一直在检查Delphi生成的地图文件,发现了一个奇怪的问题。标识符使用双点而不是单点进行分隔。

例如,从简单示例中获取的MapFile..TFoo

program MapFile;

{$APPTYPE CONSOLE}

{$R *.res}

type
  TFoo = class(TObject)
  public
    function GetFoo: string;
  end;

function TFoo.GetFoo: string;
begin
  Result := 'foo';
end;

var
  foo: TFoo;

begin
  foo := TFoo.Create;
  writeln(foo.GetFoo);
  foo.Free;
end.

以及它的公共映射文件

  Address             Publics by Name

 0001:00005AC8       MapFile..TFoo
 0001:00005BBC       MapFile.Finalization
 0004:00002BA0       MapFile.foo
 0002:000000BC       MapFile.MapFile
 0001:00005B88       MapFile.TFoo.GetFoo
 0001:000059D0       SysInit...
 0001:000059C0       SysInit...
 0001:00005AA8       SysInit...
 0001:000059B0       SysInit...
 0001:00005A98       SysInit...
 0001:00005A74       SysInit...
 0003:000007D8       SysInit...
 0001:000059A0       SysInit...
 0001:000059E0       SysInit...
 0001:000059F0       SysInit...
 0001:00005A04       SysInit...
 0001:00005A34       SysInit...
 0001:00005A4C       SysInit...
 0004:00002B98       SysInit..1

我最好的猜测是MapFile..TFoo是一个类,但为什么有双点呢?然后SysInit..1是什么意思?据我所知,Delphi没有匿名类。


嗯,Delphi确实有匿名类 - 它们实现了匿名函数/过程。但是我猜测这里可能是TFoo的VMT。就像http://i.stack.imgur.com/0kLZ0.png和http://i.stack.imgur.com/eFpD3.png一样。 - Arioch 'The
@Arioch'The,这些图片展示了C++的.map文件,使用的惯例是不同的。 - Johan
@Johan,图片没有显示.MAP - 正如你在图片本身中所看到的。它们显示.BPL。虽然我不知道EMBT内部使用哪个编译器来编译发布BPLs - 我认为他们使用DCC32。 - Arioch 'The
关于..1 - 尝试给IDE FixPack的Andreas发送电子邮件。他制作了用于恢复LLVM Delphi字符串类型的单元,并且他提到系统BPL包含无法通过纯Pascal生成的符号,除非进行二进制修补或编译器魔法。所以我猜他对这个话题更了解。 - Arioch 'The
Ping @AndreasHausladen。 - LU RD
显示剩余2条评论
1个回答

7

".." 是对类类型或更准确地说是类的VMT的引用。生成该符号是因为链接器在将v-table继承关系链接在一起以及链接运行时类型信息时需要识别它。

编译器会生成符号,这些符号永远不可能由用户代码生成。这确保了符号始终是唯一且永远不会冲突。即使是临时变量也会有一个特殊的名称和符号表中的条目。 它们被地图文件/调试信息生成过程 actively 跳过或忽略,但确实存在。


但是...条目是什么?例如:0001:0000E3A0 SysInit...HRESULT_FROM_WIN32 - Johan
通常情况下,我会查看编译器源代码以获取答案......但是,我不再有这种奢侈了,所以我只是在猜测;我认为这些条目可能与从目标文件(.obj)链接的符号有关。 - Allen Bauer

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