Какова история процесса в Linux, в котором dlopen () несколько разделяемых библиотек и исполняемый файл и / или разделяемые библиотеки скомпилированы с помощью разных компиляторов C ++ (например, предоставленных клиентами или третьими сторонами).
Правильно ли я делаю следующие предположения:
Каковы последствия использования нескольких копий (разных) libc ++ внутри одного процесса (некоторые из них статические)?
Я не ожидаю, что отдельные библиотеки смогут общаться друг с другом через интерфейс C ++, а только через интерфейс C. Я бы хотел, чтобы можно было загружать библиотеки SharedLibraries от разных поставщиков в один процесс, и они не мешали друг другу.
Я знаю, что это работало в Windows десятилетиями.
Ваш комментарий полностью меняет ваш вопрос:
I don't expect it to be able to talk to each other via a C++ interface but only via a C interface. What I expect is, that one can load SharedLibraries from different vendors into a single process and they do not screw up each other. (This btw is working on Windows since decades)
Этот элемент поведения во многом независим от системы. ФорматWindows PE и Linux ELF достаточно похожи по дизайну, поэтому они не добавляют никаких дополнительных ограничений или возможностей по этой теме. Так что, если ваша техника будет работать в Windows, то она должна работать и в Linux, просто заменив.dll
файлы для.so
файлы.
Linux имеет больше стандартизации в соглашениях о вызовах, чем Windows, так что если что-то вы обнаружите, что Linux делает это проще.
Вопрос:
there is only a single namespace for symbols in a Linux process?
Это правильно; в загрузчике Linux нет такой вещи, как пространства имен.
Как вы знаете, C и C ++ - очень разные языки. В C ++ есть пространства имен, которых нет. Когда загружаются библиотеки (как в Linux, Unix, так и в Windows), понятие пространства имен отсутствует.
Компиляторы C ++ используют изменение имен, чтобы гарантировать, что имена, изолированные пространствами имен в вашем коде, не компилируются при размещении в качестве символов в общем объекте. Компиляторы C этого не делают, и в этом нет необходимости, потому что нет пространств имен.
Вопрос:
Symbols are found and resolved only by symbol name. The source of the symbol is random in the presence of an unknown executable (customer supplied) or customer supplied shared libraries.
Заменим слово «случайный» на «непредсказуемый». Это тоже правильно. Из Википедии :
The C++ language does not define a standard decoration scheme, so each compiler uses its own. C++ also has complex language features, such as classes, templates, namespaces, and operator overloading, that alter the meaning of specific symbols based on context or usage. Meta-data about these features can be disambiguated by mangling (decorating) the name of a symbol. Because the name-mangling systems for such features are not standardized across compilers, few linkers can link object code that was produced by different compilers.
Вопрос:
What is the story regarding having a process on LINUX, which dlopen() multiple shared libraries and the executable and/or the shared libraries compiled with different C++ compilers (e.g. provided by customers or 3rd parties).
Конечно, вы можете использовать dlopen () совместно используемый объект, но dlsym () будет сложно использовать из-за искажения имени. Вам нужно будет проверить общий объект вручную, чтобы определить точное имя символа.
What are the implications of using multiple copies of (different) libc++ inside the same process (some of them static)?
Если вы зашли так далеко, я бы в первую очередь позаботился об управлении памятью. libc ++ отвечает за реализациюnew
а такжеdelete
и преобразовывая их в запросы к памяти от ОС. Если они ведут себя как GNU malloc () и free () , они могут управлять своим собственным пулом памяти. Было бы трудно предсказать, что произойдет, если вы позвонитеdelete
на объекте, созданном другой библиотекой libc ++.
похоже, что части этой случайности можно избежать, загрузив разделяемые библиотеки, используя следующие флаги, переданные в dlopen ():