我一直在检查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
据我所知,德尔福没有匿名课程。
答案 0 :(得分:7)
" .."条目是对类类型的引用,或者更准确地说是类的VMT。生成符号是因为链接器在将v-table祖先链接在一起时需要识别它并链接运行时类型信息。
编译器生成的符号不能由用户的代码生成。这确保了符号始终是唯一的并且永远不会发生碰撞。甚至临时变量也会在符号表中获得特殊名称和条目。它们被mapfile / debug信息生成主动跳过或忽略,但它们就在那里。