Рассмотрим следующий код:
#include <iostream>
#include <stdio.h>
void preinit_void();
void init_void();
__attribute__((section(".init_array")))
void (*p_init)(void) = &init_void;
void constructor_void() __attribute__((constructor));
void constructor_void() {
printf(__FUNCTION__);
}
__attribute__((section(".preinit_array")))
void (*p_preinit)(void) = &preinit_void;
void preinit_void() {
printf(__FUNCTION__);
}
void init_void() {
printf(__FUNCTION__);
}
int main() {
std::cout << __FUNCTION__ << '\n';
}
При запуске кода вывод будет
preinit_voidinit_voidconstructor_voidmain
Если бы я изменил код на:
#include <iostream>
#include <stdio.h>
void preinit_void();
void init_void();
void constructor_void() __attribute__((constructor));
void constructor_void() {
printf(__FUNCTION__);
}
__attribute__((section(".init_array")))
void (*p_init)(void) = &init_void;
__attribute__((section(".preinit_array")))
void (*p_preinit)(void) = &preinit_void;
void preinit_void() {
printf(__FUNCTION__);
}
void init_void() {
printf(__FUNCTION__);
}
int main() {
std::cout << __FUNCTION__ << '\n';
}
Выходные данные изменяются на:
preinit_voidconstructor_voidinit_voidmain
Я не понимаю, какой раздел инициализируется первым.Выходные данные изменяются просто из-за синтаксического анализа компилятором (что он сначала обнаружил секцию .init_array
вместо constructor
), или для него существует правильная последовательность инициализации?