Прежде всего контекст проблемы: Linux x64, gcc v4.8.5. Есть приложение, которое загружает две разделяемые библиотеки (пусть это module1.so и module2.so), эти модули имеют частично одинаковый код. Теперь немного кода:
//SomeClass.h
class SomeClass
{
public:
static unsigned long& s_uObj2()
{
static unsigned long s_uObj2;
return s_uObj2;
};
void Initialize();
};
//SomeClass.cpp
void SomeClass::Initialize()
{
if (0 == s_uObj2())
{
//do init
}
s_uObj2()++; //acts as a counter
}
Этот код был написан давно, и его идея состоит в том, чтобы предотвратить двойную инициализацию SomeClass в каждом модуле. Проблема: эта реализация каким-то образом разделяет значение s_uObj2 между разными модулями (в одном приложении), что приводит к тому, что инициализируется только первый модуль.
Как это возможно? Я думал это должно быть изолированное адресное пространство между разными модулями?
Пожалуйста, не указывайте мне на какое-то общее определение случая «как работают статические переменные». Что мне действительно нужно, так это анализ того, почему разные модули разделяют значение одной переменной именно в этом случае. Это потому, что это реальный проект, и я не могу реорганизовать его, чтобы заставить его работать.
extern
глобалах в Linux. - person François Andrieux   schedule 03.03.2017SomeClass
существует в обеих библиотеках? Вопрос немного не ясен. А динамические библиотеки не загружаются в отдельные адресные пространства, они загружаются в разные части адресного пространства приложения. - person Mark Ransom   schedule 03.03.2017