I have been inspecting Delphi generated Map files and I found one strange thing there. Identifiers delimited with double dots instead single one.
For instance MapFile..TFoo taken from simple example
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.
and its publics map file
  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
My best guess is that MapFile..TFoo is a class, but why double dots? And what is then SysInit..1 As far as I know Delphi does not have anonymous classes.
The ".." entries are references to the class-type or more correctly, the VMT for the class. A symbol is generated because the linker needs to identify it when linking together v-table ancestry and for linking run-time type information.
The compiler generates symbols which cannot ever be generated by the user's code. This ensures that the symbols are always unique and will never collide. Even temporary variables get a special name and an entry in the symbol table. They are actively skipped or ignored by the mapfile/debug info generation, but they are there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With