Как загрузить мой собственный libxxx.so в исходный код расширения php? - PullRequest
0 голосов
/ 12 июня 2018

Мне дали файл libxxx.so, который я не могу просмотреть в исходном коде, и я могу скомпилировать свой файл c следующей командой:

gcc -ldl libxxx.so my.c -a a.out

a.out хорошо работал в командной строке.Но после того, как я обернул его в расширение PHP, PHP показало сообщение вроде этого:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/myextension.so' - /usr/lib64/php/modules/myextension.so: undefined symbol: xxxfunction in Unknown on line 0

xxxfunction - это функция, экспортируемая libxxx.so.

Я новичокна C и я думаю, что проблема заключается в способе компиляции моего расширения PHP, я искал в Google, но не нашел ответа.
Мне интересно, есть ли опция, такая как -ldl in gcc , поэтому я могу указать, что я буду использовать libxxx.so в моем PHP расширении.
Я скомпилировал свое расширение, выполнив следующие шаги:

cd myextension/
phpize
./configure
make
make install

Я переместил файл libxxx.so в /usr/local/lib.
Мой /etc/ld.so.conf:

include ld.so.conf.d/*.conf
/usr/local/lib

Я запустил lddconfig.

1 Ответ

0 голосов
/ 13 июня 2018

Вы должны указать системе сборки связываться с общей библиотекой во время компиляции.Это позволяет сохранить зависимость в скомпилированном расширении PHP, где она будет загружена при первом использовании.

Для этого вам нужно изменить config.m4, чтобы добавить библиотеку.Вы можете сделать это с помощью макроса PHP_ADD_LIBRARY.Этот макрос добавляет библиотеку в строку ссылки и имеет вид PHP_ADD_LIBRARY($name,$append,$var).Первый параметр - это имя библиотеки;это имя файла *.so без префикса lib (например, xxx).Второй параметр определяет (я предполагаю), является ли строка добавленной или перезаписанной;обычно это должно быть установлено на 1.Последний параметр - это имя переменной, в которой хранится строка.Эту переменную необходимо подставить в выходной файл с помощью PHP_SUBST.

Вы должны поместить строку PHP_ADD_LIBRARY где-то перед макросом PHP_NEW_EXTENSION в файле config.m4.Кроме того, это хорошая идея - обернуть PHP_ADD_LIBRARY в вызов PHP_CHECK_LIBRARY.Это гарантирует, что библиотека может быть найдена системой сборки перед ее добавлением.См. Мой пример ниже.

Здесь - еще один вопрос, похожий на ваш.Здесь есть несколько рабочих примеров, которым вы можете следовать.Кроме того, я приведу здесь небольшой пример:

PHP_CHECK_LIBRARY(xxx,xxxfunction,[
    PHP_ADD_LIBRARY(xxx,1,XXX_SHARED_LIBADD)
],[
    AC_MSG_ERROR([Please install libxxx on the system])
],
[])

PHP_SUBST([XXX_SHARED_LIBADD])

Примечание. Второй параметр PHP_CHECK_LIBRARY - это функция, для которой система сборки проверяет, находит ли данная библиотека.

...