Как получить абсолютные пути к сторонним библиотекам из cffi: list-foreign-library? - PullRequest
0 голосов
/ 23 февраля 2019

Предположим, я хочу создать дамп текущих динамических библиотек, используемых в приложении Common Lisp.Как получить абсолютный путь к сторонним библиотекам, используя результат cffi: list-foreign-library ?

Было бы хорошо, если бы данное решение могло быть переносимым в операционной системеили, по крайней мере, с точки зрения реализации CL.

example

1 Ответ

0 голосов
/ 23 февраля 2019

После некоторого исследования выясняется, что после загрузки библиотеки слот pathname экземпляра foreign-library, представляющего библиотеку, изменяется для указания пути к разрешенному объектному файлу, , но он является абсолютным только тогда, когдафайл не находится в стандартном системном расположении .Например:

(cffi:list-foreign-libraries :loaded-only t)
=> (#<CFFI:FOREIGN-LIBRARY LIBSDL2 "libSDL2-2.0.so.0"> ...)

Теперь это просто вопрос доступа к слоту пути:

(mapcar #'cffi:foreign-library-pathname *)
=> (#P"libSDL2-2.0.so.0" ...)

Но здесь вы можете видеть, что путь не является абсолютным.Это потому, что когда CFFI внутренне вызвал cffi::%load-foreign-library (после небольшой трассировки) со следующими аргументами:

(cffi::%load-foreign-library "libSDL2-2.0.so.0" "libSDL2-2.0.so.0")

... и реализация нашла объектный файл, используя неявный механизм поиска системы (например, dlopen).

cffi::%load-foreign-library реализован по-разному на разных платформах, и в случае SBCL, например, указатель, полученный с помощью dlopen, хранится в объектах внутри SB-SYS:*SHARED-OBJECTS*, но насколько язнаю, что нет переносимого способа получить путь загрузки библиотеки из этого.

...