2016-04-07 18 views
6

Delphi tarafından oluşturulan Map dosyalarını inceledim ve orada garip bir şey buldum. Tanımlayıcılar, tek bir nokta yerine çift nokta ile sınırlandırıldı. Mesela MapFile..TFoo içinDouble dot .. in Delphi Harita dosyası

basit örnekte

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. 

alınan ve bayındırlık haritası dosyası

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 

En iyi tahminle MapFile..TFoo bir sınıf olduğunu, ama neden çift noktalar? Ve o zaman SysInit..1 nedir? Bildiğim kadarıyla Delphi anonim sınıflara sahip değil.

+0

Eh, Delphi anonim sınıfları var - anonim işlevler/yordamları uygularlar. Ama burada tam olarak benim tahminim, TFoo'nun VMT'siydi. Http://i.stack.imgur.com/0kLZ0.png ve http://i.stack.imgur.com/eFpD3.png –

+0

@ Arioch'The gibi bir şey, bu resimler C++ için bir .map dosyası gösterir. kullanılan kurallar farklıdır. – Johan

+0

@Johan resimleri göstermiyor .MAP - resimlerin kendilerinde gördüğünüz gibi. Onlar gösteriyorlar. Ve ben hangi derleyici EMBT sürüm BPLs derlemek için evin içinde kullandığını bilmiyorum - Ben onlar DCC32 –

cevap

7

".." girdileri, sınıf türüne veya daha doğru bir şekilde sınıf için VMT'ye yapılan başvurulardır. Bir sembol oluşturulur çünkü linker v-tablo atalarını birbirine bağlarken ve çalışma zamanı tipi bilgisini bağlarken onu tanımlamalıdır.

Derleyici, kullanıcının kodu tarafından üretilemeyen semboller üretir. Bu, sembollerin daima benzersiz olmasını ve asla çarpışmayacağını garanti eder. Geçici değişkenler bile özel bir isim ve sembol tablosunda bir giriş alır. Aktif olarak mapfile/debug bilgi üretimi tarafından atlanır veya yoksayılır, ancak oradalar.

+0

Ama ne '' 'girdileri? ör .: 0001: 0000E3A0 SysInit ... HRESULT_FROM_WIN32' – Johan

+0

Normalde, bir cevap için derleyici kaynaklarına göz atmak isterdim ... Ancak, artık bu lükse sahip değilim, bu yüzden sadece burada spekülasyon yapıyorum; Bu girişlerin, nesne dosyalarından (.obj) bağlantılı sembollerle ilgili olabileceğini düşünüyorum. –