Основная программа и общая библиотека инициализируют одну и ту же статическую переменную в __static_initialization_and_destruction_0 - PullRequest
8 голосов
/ 13 апреля 2010

Кто-нибудь знает, почему библиотека, инициализированная в dlopen (), инициализирует статическую переменную, принадлежащую основной программе. Как основная программа, так и разделяемая библиотека имеют копию статической переменной, но по какой-то причине разделяемая библиотека повторно инициализирует копию статической переменной основной программы и уничтожает ее, вызывая segfault, когда основная программа пытается его уничтожить. 1001 *

Является ли это случаем искажения имени в таблице символов?

1 Ответ

7 голосов
/ 13 апреля 2010

Это тот случай, когда компоновщик времени выполнения хочет только одну активную копию символа в процессе. Если и общий объект, и исполняемый файл имеют копию символа, компоновщик времени выполнения разрешит все ссылки на один из них.

Чтобы решить эту проблему, вы можете использовать сокращение символов с помощью команды version редактора ссылок при построении общего объекта. Убедитесь, что символ для статической переменной не является глобальным, и вы получите поведение, которое вы ищете.

...