Инициализация внутри общей библиотеки (.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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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