![]() |
eXeL@B —› Вопросы новичков —› CRT initialization |
Посл.ответ | Сообщение |
|
Создано: 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. ![]() |
|
Создано: 11 декабря 2012 09:18 · Личное сообщение · #2 |
|
Создано: 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 |