双点..在Delphi Map文件中

前端之家收集整理的这篇文章主要介绍了双点..在Delphi Map文件中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在检查Delphi生成的Map文件,我在那里发现了一件奇怪的事情.标识符用双点分隔而不是单个点.

例如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没有匿名课程.

解决方法

“..”条目是对类类型的引用,或者更准确地说是类的VMT.生成符号是因为链接器在将v-table祖先链接在一起时需要识别它并用于链接运行时类型信息.

编译器生成的符号不能由用户代码生成.这确保了符号始终是唯一的并且永远不会发生碰撞.甚至临时变量也会在符号表中获得特殊名称和条目. mapfile / debug info生成会主动跳过或忽略它们,但它们就在那里.

猜你在找的Delphi相关文章