![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что означают элементы с названиями ".1", ".2" и т.п?
Тыщ © (2008-04-24 20:02:00)Компилируем практически любую программу с ключом
-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.
ZENsan (2008-04-26 14:47:00) [1]А в публик, так как модули используют друг друга и при инициализации модуля тот инициализирует используемые (поетому там нужна эта проверка, чтобы 100 раз не вызывать инициализацию.
ZENsan (2008-04-26 14:45:00) [2]Я понимаю, что там хранятся инициализуремые данные и то что с ними связано вроде...
ZENsan (2008-04-26 14:42:00) [3].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).
Надеюсь прояснил чуток.. Может я где-то неправ - поправьте.
Игорь Шевченко (2008-04-25 19:38:00) [4]Таки magic
Тыщ (2008-04-25 16:46:00) [5]han_malign © (25.04.08 15:19) [14]
О, cпасибо за объяснение!
Ох уж эти навязчивые сервисы Delphi...
han_malign (2008-04-25 15:21:00) [6]
> если секций initialization/finalization нет, то она всеравно есть
- в смысле - initialization/finalization - неявно присутствует, но состоит только из изменения этого самого счетчика...
han_malign (2008-04-25 15:19:00) [7].X - неявная переменная - счетчик ссылок на модуль(для отсекания выполненения секций initialization/finalization)
initialization
dec dword ptr[$004...], 1
jnb +...
.....
finalization
inc dword ptr[$004...], 1
jnz +...
.....
end.
если секций initialization/finalization нет, то она всеравно есть - возможно где-то еще используется...
Тыщ (2008-04-25 14:33:00) [8]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
Sapersky (2008-04-25 14:13:00) [9]Встречал подобные имена у неявно объявленных типов, например:
Text : array of TMyRecord; // имя типа ".2"
TMyArray = array of TMyRecord; // а если объявить явно
Text : TMyArray; // будет конкретное имя "TMyArray"
Но в map-file типы, вроде как, не выводятся. Может, это имена "псевдопроцедур" initialization/finalization?
Игорь Шевченко (2008-04-25 09:45:00) [10]map-файл штука полезная. Во-первых, можно посмотреть, где произошла ошибка, во-вторых, этим пользуются обработчики исключений, генерирующие трассировку вызовов.
В-третьих, можно посмотреть, какие точно ресурсы вошли в приложение
KSergey (2008-04-25 07:01:00) [11]> Тыщ (25.04.08 00:43) [9]
> для контроля.
А что вы по ним контролируете??
Тыщ (2008-04-25 00:43:00) [12]Германн © (25.04.08 0:39) [8]
> А для чего нужен map-файл?
Примерно для того же, для чего нужны логи - для контроля.
Германн (2008-04-25 00:39:00) [13]
> Компилируем практически любую программу с ключом -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-файл?
Тыщ (2008-04-25 00:06:00) [14]Игорь Шевченко © (24.04.08 23:46) [6]
Хм... Ну так идентификаторы, объявленные в процедурах не должны "просвечивать" в глобальную область имен и появляться в map-файле.
Что ж, без объяснений пока придется принять за "Compiler-магию".
Игорь Шевченко (2008-04-24 23:46:00) [15]Тыщ (24.04.08 22:37) [5]
Э...в модуле System как бы в ассемблерных процедурах есть много ассемблерного кода. Кроме того, это могут быть и Compiler Magic-и.
Тыщ (2008-04-24 22:37:00) [16]Игорь Шевченко © (24.04.08 22:09) [4]
> идентификаторы, объявленные в ассемблерном коде модуля System ?
Ассемблерный код - это как? В Delphi я знаю только ассемблерные функции и процедуры.
> Насколько видно, все такие имена относятся к секции данных.
Нет, не все. Хотя большинство - к секции данных, да.
Игорь Шевченко (2008-04-24 22:09:00) [17]идентификаторы, объявленные в ассемблерном коде модуля System ?
Насколько видно, все такие имена относятся к секции данных.
Тыщ (2008-04-24 20:37:00) [18]очень жаль, если так.
Сергей М, (2008-04-24 20:35:00) [19]Удалено модератором
Тыщ (2008-04-24 20:13:00) [20]В Delphi 2006, 2007 это выглядит, как
<имя программы>...
System..1
System..3
что не слишком проясняет вопрос.