2016-04-07 39 views
6

Tôi đã kiểm tra Delphi tạo ra các tập tin bản đồ và tôi tìm thấy một điều kỳ lạ ở đó. Định danh được phân cách bằng dấu chấm kép thay vì một dấu chấm.Dấu chấm kép .. trong Delphi Bản đồ tập tin

Ví dụ MapFile..TFoo lấy từ ví dụ đơn giản

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. 

và công chúng bản đồ tập tin của nó

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 

đoán tốt nhất của tôi là MapFile..TFoo là một lớp học, nhưng tại sao chấm đôi? Và những gì sau đó là SysInit..1 Theo như tôi biết Delphi không có các lớp học vô danh.

+0

Vâng, Delphi có các lớp ẩn danh - chúng thực hiện các chức năng/thủ tục ẩn danh. Nhưng ở đây chính xác tôi đoán sẽ là VMT của TFoo. Một cái gì đó như http://i.stack.imgur.com/0kLZ0.png và http://i.stack.imgur.com/eFpD3.png –

+0

@ Arioch'The, những ảnh đó hiển thị tệp '.map' cho C++ , các quy ước được sử dụng là khác nhau. – Johan

+0

@Johan các hình ảnh không hiển thị .MAP - như bạn có thể thấy trong các hình ảnh mình. Chúng hiển thị .BPL. Và trong khi tôi không biết trình biên dịch EMBT nào sử dụng bên trong ngôi nhà để biên dịch các bản phát hành BPL - tôi nghĩ họ sử dụng DCC32 –

Trả lời

7

Mục ".." là tham chiếu đến loại lớp hoặc chính xác hơn, VMT cho lớp. Một biểu tượng được tạo ra bởi vì trình liên kết cần xác định nó khi liên kết với nhau với tổ tiên bảng v và để liên kết thông tin kiểu thời gian chạy.

Trình biên dịch tạo ra các biểu tượng không bao giờ có thể được tạo bởi mã của người dùng. Điều này đảm bảo rằng các ký hiệu luôn là duy nhất và sẽ không bao giờ va chạm. Ngay cả các biến tạm thời cũng có một tên đặc biệt và một mục nhập trong bảng biểu tượng. Họ đang tích cực bỏ qua hoặc bỏ qua bởi các mapfile/debug thông tin thế hệ, nhưng họ đang có.

+0

Nhưng mục '...' là gì? ví dụ: '0001: 0000E3A0 SysInit ... HRESULT_FROM_WIN32' – Johan

+0

Thông thường, tôi sẽ xem xét thông qua các nguồn trình biên dịch cho một câu trả lời ... Tuy nhiên, tôi không còn có sự sang trọng đó vì vậy tôi chỉ suy đoán ở đây; Tôi nghĩ rằng các mục có thể liên quan đến các biểu tượng được liên kết từ các tệp đối tượng (.obj). –

Các vấn đề liên quan