Сейчас на форуме: asfa, _MBK_, Adler (+8 невидимых)

 eXeL@B —› Вопросы новичков —› CRT initialization
Посл.ответ Сообщение


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 11 декабря 2012 04:05
· Личное сообщение · #1

Пытаюсь разобраться почему "расстояние" между
"__xi_z" и "__xi_а" не равно "расстоянию" между "__xс_z" и " __xс_а".
т.е., к примеру, в моем случае между секциями (".CRT$XIZ") и (".CRT$XIA") 0х210 bytes,
а между (".CRT$XCZ") и (".CRT$XCA") 0х104?
Ведь идея вроде бы в том, чтобы оставить достаточно места как минимум еще для 24-х секций (26-2) на тот случай, если появится желание вставить свою секцию .
Что это получается, разные размеры секций для c-initialization и C++ initialization?
Где и как и кем эти размеры определяюся?


#pragma data_seg(".CRT$XIA")
_PVFV __xi_a[1] = {NULL};
#pragma data_seg(".CRT$XIZ")
_PVFV __xi_z[1] = {NULL};

#pragma data_seg(".CRT$XCA")
_PVFV __xc_a[1] = {NULL};
#pragma data_seg(".CRT$XCZ")
_PVFV __xc_z[1] = {NULL};

-----
Give me a HANDLE and I will move the Earth.




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 11 декабря 2012 09:18
· Личное сообщение · #2

может выравнивание границ?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 11 декабря 2012 09:40 · Поправил: plutos
· Личное сообщение · #3

Да, некоторое выравнивание имеет место:
the linker may pad the data to align it to 4-byte or 16-byte borders
Но тут уж слишком большая разница, тем более, что по теории (или как я ее понял) разница между офсетами должна быть одинаковой для всех сегментов: I, C, P, T.

Microsoft named the segments that are used for initialization and termination ".CRT$Xpq" where p is the category or group ('I'=C init, 'C'=C++ init, 'P'=Pre-terminators and 'T'=Terminators), and q is the segment within that group: 'A' is the first and 'Z' is the last.

T.e мы вроде бы как говорим:
Есть четыре группы функций, две будут вызваны до main() и две после main().
Compiler, к примеру, если видит global variable, добавляет pointer to function типа
typedef void (*_PVFV)(void);
в промежуток между __xi_a и __xi_z. Эту функцию потом вызовет
_initterm(__xi_a, __xi_z); /* C Initialization */ и все будет хорошо.
На каждую группу функций выделяем места для 24 pointers (24 секции). Хотите, создавайте в промежутках свою секцию (".USER001".) и в нее помещайте свои поинтеры. _initterm их вызовет и будет вам счастье.
В теории всем группам должно быть выделено одинаковое количество памяти, а на практике это не так почему-то.

-----
Give me a HANDLE and I will move the Earth.



 eXeL@B —› Вопросы новичков —› CRT initialization
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати