Загрузка библиотек Linux внутри программы FreeBSD (скрипт Python)

Я пытаюсь использовать некоторые библиотеки Linux под FreeBSD/PC-BSD, и у меня есть некоторые сомнения относительно того, как работает бинарная совместимость Linux с FreeBSD.

Я установил необходимый модуль ядра для этой задачи с дополнительным пакетом linux_base, содержащим библиотеки Linux.

Сама библиотека называется libspotify, ее можно скачать здесь (для FreeBSD нет доступных сборок libspotify, поэтому необходимо использовать Linux): https://developer.spotify.com/technologies/libspotify/#скачать

Запуск этого фрагмента кода Python завершается ошибкой:

import ctypes
lib_path = './libspotify.so'
lib = ctypes.cdll.LoadLibrary(lib_path)

В нем говорится следующее:

OSError: Shared object "libpthread.so.0" not found, required by "libspotify.so"

В руководстве говорится, что бинарные файлы Linux должны быть помечены с помощью brandelf, и я так и сделал: http://www.freebsd.org/doc/handbook/linuxemu-lbc-install.html#idp74327472

Но пока это не работает.

Итак, вопрос в следующем: бинарная совместимость с Linux предназначена только для исполняемых файлов Linux или также подходит для загрузки библиотек Linux внутри исполняемых файлов FreeBSD?

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

Заранее спасибо.


person azkotoki    schedule 08.01.2014    source источник
comment
Насколько я знаю, он первый. Уровень эмуляции Linux будет вызываться только исполняемыми файлами Linux. Конечно, есть исключения, такие как nspluginwrapper.   -  person Elliott Frisch    schedule 09.01.2014


Ответы (1)


Итак, вопрос: бинарная совместимость с Linux предназначена только для исполняемых файлов Linux или также подходит для загрузки библиотек Linux внутри исполняемых файлов FreeBSD?

Краткий ответ - это только для исполняемых файлов Linux. Он не будет работать для загрузки общих библиотек Linux из исполняемых файлов FreeBSD.

Более длинная версия:

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

Для сравнения, когда вы запускаете бинарные файлы Linux на FreeBSD, ядро ​​определяет, что это бинарные файлы Linux (здесь помогает brandelf), а затем делает две вещи — заменяет таблицу системных вызовов процесса ss на ту, которая будет обрабатывать системные вызовы Linux, и перенаправляет корень файловой системы в / совместимость/линукс. После этого он запускает linux ld.so, который затем загружает динамические библиотеки linux и разрешает символы среди них.

Использование общего объекта linux непосредственно из приложения freebsd теоретически возможно, но на практике это сложно сделать. Вам нужно выяснить, как обрабатывать системные вызовы linux, которые может выполнять библиотека, иметь дело с функциями, которые она может захотеть вызвать из общих библиотек linux, работать с файлами, которые она может захотеть открыть, предполагая, что linux макет файловой системы и т. д.

Более прагматичное решение состоит в том, чтобы иметь какой-то «прокси» бинарный linux, который будет загружать вашу общую библиотеку linux и который будет взаимодействовать с бинарным файлом freebsd через своего рода IPC и выполнять вызовы в код linux от имени приложения FreeBSD. Я считаю, что именно так веб-браузер Opera запускает плагины Linux на FreeBSD. Если вам интересно, взгляните на NSpluginwrapper, который делает что-то подобное.

person ArtemB    schedule 08.01.2014