-
Компилируем практически любую программу с ключом -gp , смотрим в файл <имя программы>.map , и в начале секции Publics by Name видим: 0002:0000133C ..
0001:00006688 ..
0002:00002654 .1
0002:0000266C .1
0002:0000265C .1
0002:00002664 .1
0002:00002660 .3
0002:000025A4 .5
0002:00002668 .7
... и т.д.
Очень интересно, что эти элементы означают и для чего они нужны? Появляются в Delphi 4, 5, 6, 7.
-
В Delphi 2006, 2007 это выглядит, как <имя программы>...
System..1
System..3 что не слишком проясняет вопрос.
-
Удалено модератором
-
очень жаль, если так.
-
идентификаторы, объявленные в ассемблерном коде модуля System ? Насколько видно, все такие имена относятся к секции данных.
-
Игорь Шевченко © (24.04.08 22:09) [4]
> идентификаторы, объявленные в ассемблерном коде модуля System ?
Ассемблерный код - это как? В Delphi я знаю только ассемблерные функции и процедуры.
> Насколько видно, все такие имена относятся к секции данных.
Нет, не все. Хотя большинство - к секции данных, да.
-
Тыщ (24.04.08 22:37) [5]
Э...в модуле System как бы в ассемблерных процедурах есть много ассемблерного кода. Кроме того, это могут быть и Compiler Magic-и.
-
Игорь Шевченко © (24.04.08 23:46) [6]
Хм... Ну так идентификаторы, объявленные в процедурах не должны "просвечивать" в глобальную область имен и появляться в map-файле.
Что ж, без объяснений пока придется принять за "Compiler-магию".
-
> Компилируем практически любую программу с ключом -gp, > смотрим в файл <имя программы>.map, > и в начале секции Publics by Name видим: > > 0002:0000133C .. > 0001:00006688 .. > 0002:00002654 .1 > 0002:0000266C .1 > 0002:0000265C .1 > 0002:00002664 .1 > 0002:00002660 .3 > 0002:000025A4 .5 > 0002:00002668 .7 > ... и т.д. > > > Очень интересно, что эти элементы означают и для чего они > нужны?
Во-во. Очень интересно "для чего они нужны". Вот только тут попутный вопрос. А для чего нужен map-файл?
-
Германн © (25.04.08 0:39) [8] > А для чего нужен map-файл?
Примерно для того же, для чего нужны логи - для контроля.
-
> Тыщ (25.04.08 00:43) [9] > для контроля.
А что вы по ним контролируете??
-
map-файл штука полезная. Во-первых, можно посмотреть, где произошла ошибка, во-вторых, этим пользуются обработчики исключений, генерирующие трассировку вызовов. В-третьих, можно посмотреть, какие точно ресурсы вошли в приложение
-
Встречал подобные имена у неявно объявленных типов, например: Text : array of TMyRecord; // имя типа ".2" TMyArray = array of TMyRecord; // а если объявить явно Text : TMyArray; // будет конкретное имя "TMyArray" Но в map-file типы, вроде как, не выводятся. Может, это имена "псевдопроцедур" initialization/finalization?
-
Sapersky (25.04.08 14:13) [12]Да, типы не выводятся в map-файл. А имена типов динамических массивов всегда включатся в exe-шник. > Может, это имена "псевдопроцедур" initialization/finalization? Часть - действительно они. А остальное что - непонятно. Delphi 2006: 0004:000000C4 Unit1..1
0004:0001823C PROGRAM...
0003:00001320 PROGRAM...
0004:0000002C System..5
-
.X - неявная переменная - счетчик ссылок на модуль(для отсекания выполненения секций initialization/finalization) initialization
dec dword ptr[$004...], 1
jnb +...
.....
finalization
inc dword ptr[$004...], 1
jnz +...
.....
end.
если секций initialization/finalization нет, то она всеравно есть - возможно где-то еще используется...
-
> если секций initialization/finalization нет, то она всеравно есть
- в смысле - initialization/finalization - неявно присутствует, но состоит только из изменения этого самого счетчика...
-
han_malign © (25.04.08 15:19) [14]
О, cпасибо за объяснение!
Ох уж эти навязчивые сервисы Delphi...
-
Таки magic
-
.1 .2 .3 - эти не хитрости компилятора, а давно используемая вешь с константными данными. Переведите адрес любого Entry
Start Length Name Class
0001:00401000 00054534H .text CODE
0002:00456000 00000798H .itext ICODE
0003:00457000 00001B00H .data DATA
0004:00459000 00004CD8H .bss BSS
0005:00000000 00000038H .tls TLS
Тоесть все адреса в МАП фаиле с адресом к примеру
0004:00004CCC Unit1..2
Должны транслироваться как 00459000 + 4CCC На самом деле там переменная, хранящая статус инициализации модуля (была ли вызвана секция инициализации, если да, то повторно она не вызывается). Код где используется этот адрес:
0045673C unit00000034.Initialization:
0045673C 832DD4DC450001 sub dword ptr [L0045DCD4],00000001h
00456743 7313 jnc L00456758
00456745 33C9 xor ecx,ecx
00456747 B201 mov dl,01h
00456749 A1A0514500 mov eax,[TForm2.Object_Entry]
0045674E E8D932FFFF call SUB_L00449A2C
00456753 A3D0DC4500 mov [L0045DCD0],eax
00456758 L00456758:
00456758 C3 retn
Ну а вообще такие ссылки все помоему на секцию BSS ( http://en.wikipedia.org/wiki/Block_Started_by_Symbol). Надеюсь прояснил чуток.. Может я где-то неправ - поправьте.
-
Я понимаю, что там хранятся инициализуремые данные и то что с ними связано вроде...
-
А в публик, так как модули используют друг друга и при инициализации модуля тот инициализирует используемые (поетому там нужна эта проверка, чтобы 100 раз не вызывать инициализацию.
|