Arhn - архитектура программирования

неопределенный символ: PyOS_InputHook, из общей библиотеки

Я написал «плагин Python» на C++ для приложения C++, отличного от Python.
В какой-то момент этот плагин, который является .so, инициализирует интерпретатор Python и открывает консоль Python.
Для удобства « затем импортируется модуль readline», и мы получаем эту ошибку:

ImportError: /usr/lib/python2.7/lib-dynload/readline.so: неопределенный символ: PyOS_InputHook

Команда ссылки (сгенерированная cmake):

/usr/bin/c++ -fPIC -Wall -Wextra -O3 -DNDEBUG -Xlinker -export-dynamic -Wl,-fwhole-program /usr/lib/libpython2.7.a -shared -Wl,-soname,libMyplugin.so -o libMyplugin.so [исходники] [библиотеки qt] -lGLU -lGL -lX11 -lXext -lc -lc -lpython2.7 -Wl,-rpath,/src:/usr/local/Trolltech/Qt-4.8.4/ библиотека:

nm libMyplugin.so дает следующие символы, связанные с Python:

                 U Py_Finalize
                 U Py_Initialize
00000000002114a8 B PyOS_InputHook
                 U PyRun_InteractiveLoopFlags
                 U PyRun_SimpleStringFlags

Мы видим, что PyOS_InputHook определено в разделе BSS плагина. Тем не менее, readline.so Python не может его найти.

Вопрос почему и как это исправить.


  • Одно из возможных объяснений: когда основное приложение загружает плагин с помощью dlopen(), оно может использовать некоторый флаг RTLD_LOCAL вместо RTLD_GLOBAL. Тогда символы не будут доступны для .so, загруженного впоследствии (например, readline.so). Для проверки... 24.03.2013
  • Собственно, PyOS_InputHook изначально не присутствовал в libMyplugin.so, да и не работал. Позже я добавил такое определение этого символа в исходный код плагина, чтобы посмотреть, помогло ли это. Это не. 24.03.2013

Ответы:


1

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

Чтобы это исправить, при загрузке плагина следует использовать флаг RTLD_GLOBAL.
Если нет контроля над основным приложением (как в данном случае) и над тем, как оно использует dlopen(), все равно можно "перезагрузить" плагин из самого плагина, используя dlopen() с флагами RTLD_NOLOAD | RTLD_GLOBAL, чтобы разрешать все ранее неразрешенные символы в текущей загруженной библиотеке.

Это решает проблему.

23.03.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..