如何从cffi:list-foreign-libraries获取国外库的绝对路径?

How to get the absolute paths of foreign libraries from cffi:list-foreign-libraries?

假设我想创建一个 Common Lisp 应用程序中使用的当前动态库的转储。给定 cffi:list-foreign-libraries?

的结果,如何获取国外库的绝对路径

如果给定的解决方案可以在操作系统方面或至少在 CL 实现方面是可移植的,那就太好了。

经过一些调查,似乎一旦加载库,代表库的 foreign-library 实例的 pathname 槽被修改为指向已解析目标文件的路径,但只有当文件不在标准系统位置时它才是绝对的。例如:

(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*里面的对象中,但是到目前为止据我所知,没有可移植的方法来检索从中加载的库的路径。