linux и разделяемые библиотеки и разные компиляторы g ++

Какова история процесса в Linux, в котором dlopen () несколько разделяемых библиотек и исполняемый файл и / или разделяемые библиотеки скомпилированы с помощью разных компиляторов C ++ (например, предоставленных клиентами или третьими сторонами).

Правильно ли я делаю следующие предположения:

  1. существует только одно пространство имен для символов в процессе Linux. Символы обнаруживаются и разрешаются только по имени символа. Источник символа является случайным при наличии неизвестного исполняемого файла (предоставляется заказчиком) или совместно используемых библиотек, предоставляемых заказчиком.
  2. нет способа убедиться, что символы STL / boost разрешаются из правильного источника, поскольку они всегда слабые и, следовательно, могут быть перезаписаны.

Каковы последствия использования нескольких копий (разных) libc ++ внутри одного процесса (некоторые из них статические)?

Я не ожидаю, что отдельные библиотеки смогут общаться друг с другом через интерфейс C ++, а только через интерфейс C. Я бы хотел, чтобы можно было загружать библиотеки SharedLibraries от разных поставщиков в один процесс, и они не мешали друг другу.

Я знаю, что это работало в Windows десятилетиями.

Источник
  • 0
    Код C ++ разных производителей никогда не будет сотрудничать. Подробности: yosefk.com/c++fqa/mixing.html
  • 0
    @Lorinczy Zsigmond Что значит сотрудничать? Я не ожидаю, что они смогут общаться друг с другом через интерфейс C ++, а только через интерфейс C. Я ожидаю, что можно загружать библиотеки SharedLibraries от разных поставщиков в один процесс, и они не портят друг друга. (Этот кстати работает над Windows десятилетиями)
  • 1
    @FrankPuck упомянул, что в вашем вопросе было бы очень хорошей идеей. Если вы его пропустите, ваш вопрос будет вводить в заблуждение.
Codelisting
за 1 против

Ваш комментарий полностью меняет ваш вопрос:

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 ++.

  • 0
    Примечание: с dlsym было бы сложно, если бы символы имели стандартную привязку C ++. Хорошей практикой является использование C-связывания для внешних (экспортируемых) интерфейсных функций (или даже предоставление полной C-оболочки для библиотеки).
  • 0
    @alagner согласился. Если у вас есть контроль над скомпилированными библиотеками, не используйте интерфейс C ++, используйте интерфейс C. Но это результат этого ответа. ;-)
  • 0
    мой вопрос не имел ничего общего с пространствами имен C ++?!?!
  • 0
    @FrankPuck Вы упомянули символы WRT пространств имен, но нет концепции пространств имен для символов Linux. Однако суть пространств имен C ++ заключается в том, как они обрабатываются с изменением имени. Используется искажение имени факта, и тот факт, что разные компиляторы делают это по-разному, означает, что символы, сгенерированные из имен C ++, не будут совпадать между компиляторами.
за 0 против

похоже, что части этой случайности можно избежать, загрузив разделяемые библиотеки, используя следующие флаги, переданные в dlopen ():

  • RTLD_LOCAL
  • RTLD_DEEPBIND
Codelisting
Популярные категории
На заметку программисту