Инициализация внутри общей библиотеки (.so)Linux

Anonymous
Инициализация внутри общей библиотеки (.so)

Сообщение Anonymous »

Я переношу более крупный проект на Linux (первоначально Windows) и мне очень не хватает аналога Windows DllMain().

Код: Выделить всё

DllMain(DLL_PROCESS_ATTACH)
вызывается после завершения инициализации среды выполнения C (CRT), поэтому вся глобальная статика (независимо от единицы трансляции) уже инициализирована. Здесь вы можете делать более сложные вещи до вызова main(), соответственно. LoadLibrary/dlopen возвращается.
Я пытаюсь добиться аналогичного поведения в Linux. Я оценил GCC __attribute__((init_priority)) и __attribute__((destructor)), но безуспешно, так как кажется невозможным указать приоритет по умолчанию 0xFFFF - поэтому вы не получите функцию который вызывается после динамической инициализации вашей статики. (И пометить все статики, кроме выбранного, меньшим номером просто невозможно).
Последняя надежда - это ELF init/fini, который выводит меня на уровень, который я достиг никогда раньше не было.
Выполняется ли инициализация/деинит CRT через init/fini ? Если я регистрирую свои собственные функции init/fini, я предполагаю, что те, которые по умолчанию инициализируют/деинициируют CRT, перезаписываются, поскольку, честно говоря, нет никакой цепочки функций init/fini. Если это так, мне нужно самостоятельно инициализировать/деинициировать CRT, но как мне это сделать?
Или я совершенно на неправильном пути?

Подробнее здесь: https://stackoverflow.com/questions/791 ... library-so

Вернуться в «Linux»