2014-10-11 4 views
0

Может ли кто-нибудь объяснить, почему загрузка разделяемой библиотеки повреждает статическую переменную?Статическое повреждение переменной при загрузке разделяемой библиотеки

  • Выход на Linux (AltLinux, OpenSUSE): 1 истинный 0
  • Выход на ОС Windows (с использованием MinGW): 1 правда 1

Qt 5.3.1: https://github.com/ipostanogov/variables-destroyer

+0

Visual Studio 2013 также в порядке. – Serhiy

+2

SO вопросы (и ответы) должны быть самодостаточными и иметь смысл, даже если какие-либо ссылки в них ломаются ... – hyde

+0

@hyde Вы ожидаете, что я опубликую здесь содержание из 9 файлов? Шутки в сторону? Во всяком случае, кнопка 'улучшить этот вопрос' ждет вас. –

ответ

0

Это зависит на платформе и компиляторе. Одним из решений является инициализация этой статической переменной в качестве ожидаемого значения в вашем коде.

+0

В этом случае он должен использовать std :: list, поскольку QList не поддерживает инициализаторы. и стандартный список может быть инициализирован как std :: list Core :: stdList = {41, 42}; Но в любом случае, загрузка библиотеки не должна быть свободной от статических переменных. – Serhiy

+0

Ожидаемое значение отсутствует. Это простой пример. Программа реального слова извлекает информацию из библиотеки и сохраняет ее в статической переменной. –

+1

@Serhiy: Почему не будет 'QList список (QList () << 1 << 2 << 3)' работа в этом случае? – user2672165

0

Возможно, когда вы загружаете общую библиотеку, у нее есть другая копия ядра (с пустым списком). и после загрузки shared lib вы можете получить доступ ко второй копии, или этот статический список был инициализирован второй раз (опять же, после загрузки библиотеки он будет пуст). Попробуйте сравнить адреса этого списка до и после загрузки библиотеки, и вы получите ответ. В любом случае кажется, что проблема заключается в использовании двух экземпляров статической переменной.

0

Вы должны убедиться, что динамическая библиотека связана с той же библиотекой Qt, которую вы использовали для сборки программы. Это не должно быть проблемой, потому что QT совместим с бинами, однако я вижу эту ошибку много в Windows, где мы переключились на новый компилятор (mingw 4.8) с другим ABI. Возможно, это эффект, который вы видите.

0

Такое поведение наблюдается, потому что глобальная таблица смещения (GOT), которая используется ld.so для исполняемого образа init. Фактически статическое поле в приведенном выше примере инициализируется дважды. Первый раз при загрузке исполняемого файла, второй раз при загрузке библиотеки. «static_initialization_and_destruction» proc вызывает процедуру ld.lib «dl_init_internal».

Смежные вопросы