Конференция "Основная" » Что означают элементы с названиями ".1", ".2" и т.п?
 
  • Тыщ (24.04.08 20:02) [0]
    Компилируем практически любую программу с ключом
    -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.
  • Тыщ (24.04.08 20:13) [1]
    В Delphi 2006, 2007 это выглядит, как
    <имя программы>...
    System..1
    System..3


    что не слишком проясняет вопрос.
  • Сергей М, (24.04.08 20:35) [2]
    Удалено модератором
  • Тыщ (24.04.08 20:37) [3]
    очень жаль, если так.
  • Игорь Шевченко © (24.04.08 22:09) [4]
    идентификаторы, объявленные в ассемблерном коде модуля System ?
    Насколько видно, все такие имена относятся к секции данных.
  • Тыщ (24.04.08 22:37) [5]
    Игорь Шевченко ©   (24.04.08 22:09) [4]

    > идентификаторы, объявленные в ассемблерном коде модуля System ?

    Ассемблерный код - это как? В Delphi я знаю только ассемблерные функции и процедуры.

    > Насколько видно, все такие имена относятся к секции данных.

    Нет, не все. Хотя большинство - к секции данных, да.
  • Игорь Шевченко © (24.04.08 23:46) [6]
    Тыщ   (24.04.08 22:37) [5]

    Э...в модуле System как бы в ассемблерных процедурах есть много ассемблерного кода. Кроме того, это могут быть и Compiler Magic-и.
  • Тыщ (25.04.08 00:06) [7]
    Игорь Шевченко ©   (24.04.08 23:46) [6]

    Хм... Ну так идентификаторы, объявленные в процедурах не должны "просвечивать" в глобальную область имен и появляться в map-файле.

    Что ж, без объяснений пока придется принять за "Compiler-магию".
  • Германн © (25.04.08 00:39) [8]

    > Компилируем практически любую программу с ключом -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 00:43) [9]
    Германн ©   (25.04.08 0:39) [8]
    > А для чего нужен map-файл?

    Примерно для того же, для чего нужны логи - для контроля.
  • KSergey © (25.04.08 07:01) [10]
    > Тыщ   (25.04.08 00:43) [9]
    > для контроля.

    А что вы по ним контролируете??
  • Игорь Шевченко © (25.04.08 09:45) [11]
    map-файл штука полезная. Во-первых, можно посмотреть, где произошла ошибка, во-вторых, этим пользуются обработчики исключений, генерирующие трассировку вызовов.
    В-третьих, можно посмотреть, какие точно ресурсы вошли в приложение
  • Sapersky (25.04.08 14:13) [12]
    Встречал подобные имена у неявно объявленных типов, например:
     Text : array of TMyRecord; // имя типа ".2"
     TMyArray = array of TMyRecord; // а если объявить явно
     Text : TMyArray; // будет конкретное имя "TMyArray"
    Но в map-file типы, вроде как, не выводятся. Может, это имена "псевдопроцедур" initialization/finalization?
  • Тыщ (25.04.08 14:33) [13]
    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

  • han_malign © (25.04.08 15:19) [14]
    .X - неявная переменная - счетчик ссылок на модуль(для отсекания выполненения секций initialization/finalization)
    initialization
      dec dword ptr[$004...], 1
      jnb +...
      .....
    finalization
      inc dword ptr[$004...], 1
      jnz +...
      .....
    end.


    если секций initialization/finalization нет, то она всеравно есть - возможно где-то еще используется...
  • han_malign © (25.04.08 15:21) [15]

    > если секций initialization/finalization нет, то она всеравно есть

    - в смысле - initialization/finalization - неявно присутствует, но состоит только из изменения этого самого счетчика...
  • Тыщ (25.04.08 16:46) [16]
    han_malign ©   (25.04.08 15:19) [14]

    О, cпасибо за объяснение!

    Ох уж эти навязчивые сервисы Delphi...
  • Игорь Шевченко © (25.04.08 19:38) [17]
    Таки magic
  • ZENsan © (26.04.08 14:42) [18]
    .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).

    Надеюсь прояснил чуток.. Может я где-то неправ - поправьте.
  • ZENsan © (26.04.08 14:45) [19]
    Я понимаю, что там хранятся инициализуремые данные и то что с ними связано вроде...
  • ZENsan © (26.04.08 14:47) [20]
    А в публик, так как модули используют друг друга и при инициализации модуля тот инициализирует используемые (поетому там нужна эта проверка, чтобы 100 раз не вызывать инициализацию.
 
Конференция "Основная" » Что означают элементы с названиями ".1", ".2" и т.п?
Есть новые Нет новых   [134487   +1][b:0][p:0.002]