linux и разделяемые библиотеки и разные компиляторы g ++ - PullRequest
0 голосов
/ 05 августа 2020
• 1000

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 06 августа 2020

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

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

Этот элемент поведения в значительной степени независим от системы. Windows PE формат и Linux ELF достаточно похожи по дизайну, поэтому они не добавляют никаких дополнительных ограничений или возможностей для этого topi c. Так что, если ваша техника будет работать в Windows, то она должна работать и в Linux, просто заменив .dll файлы на .so файлы.

Linux имеет большую стандартизацию около соглашения о вызовах , чем Windows, так что если что, вы обнаружите, что Linux делает это проще.

Исходный ответ

Вопрос:

есть только одно пространство имен для символов в процессе Linux?

Верно; в загрузчике Linux нет такой вещи, как пространства имен.

Как вы, возможно, знаете, C и C ++ - очень разные языки. В C ++ есть пространства имен C нет. Когда загружаются библиотеки (как в Linux, Unix, так и в Windows), понятие пространства имен отсутствует.

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

Вопрос:

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

Давайте заменим слово «случайный» на непредсказуемый. Это тоже правильно. Из Википедии :

Язык C ++ не определяет стандартную схему оформления, поэтому каждый компилятор использует свою собственную. C ++ также имеет сложные языковые функции, такие как классы, шаблоны, пространства имен и перегрузка операторов, которые изменяют значение определенных c символов в зависимости от контекста или использования. Мета-данные об этих функциях могут быть устранены путем изменения (украшения) имени символа. Поскольку системы изменения имен для таких функций не стандартизированы для разных компиляторов, немногие компоновщики могут связывать объектный код, созданный разными компиляторами.

Вопрос:

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

Конечно, dlopen () общий объект, но dlsym () будет сложно использовать, потому что искажения имени. Вам придется вручную проверить общий объект, чтобы определить точное имя символа.

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

Если вы зашли так далеко, тогда я В первую очередь я бы позаботился об управлении памятью. libc ++ отвечает за реализацию new и delete и преобразование их в запросы памяти из ОС. Если они будут вести себя как GNU mallo c () и free () , они могут управлять своим собственным пулом памяти. Было бы трудно предсказать, что произойдет, если вы вызовете delete для объекта, созданного другой libc ++.

0 голосов
/ 05 августа 2020

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

  • RTLD_LOCAL
  • RTLD_DEEPBIND
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...