gpt4 book ai didi

python - 在Python中获取共享库的绝对路径

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:06 27 4
gpt4 key购买 nike

假设我想在 Python 中使用 libc。这可以通过以下方式轻松完成

from ctypes import CDLL
from ctypes.util import find_library

libc_path = find_library('c')
libc = CDLL(libc_path)

现在,我知道我可以使用 ldconfig 获取 libc 的绝对路径,但是有没有办法从 CDLL 对象获取它?它的 _handle 有什么可以做的吗?

更新:好的。

libdl = find_library('dl')
RTLD_DI_LINKMAP = 2
//libdl.dlinfo(libc._handle, RTLD_DI_LINKMAP, ???)

那我需要重新定义 link_map 结构吗?!

最佳答案

在此上下文中的句柄基本上是对内存映射库文件的引用。

但是,在操作系统功能的帮助下,有一些现有的方法可以实现您想要的。

window :Windows 为此目的提供了一个 API,称为 GetModuleFileName。一些使用示例已经是 here .

Linux:存在用于此目的的 dlinfo 函数,请参阅 here .


我尝试使用 ctypes,这是我针对基于 linux 的系统的解决方案。到目前为止,我对 ctypes 的了解为零,如果有任何改进建议,我将不胜感激。

from ctypes import *
from ctypes.util import find_library

#linkmap structure, we only need the second entry
class LINKMAP(Structure):
_fields_ = [
("l_addr", c_void_p),
("l_name", c_char_p)
]

libc = CDLL(find_library('c'))
libdl = CDLL(find_library('dl'))

dlinfo = libdl.dlinfo
dlinfo.argtypes = c_void_p, c_int, c_void_p
dlinfo.restype = c_int

#gets typecasted later, I dont know how to create a ctypes struct pointer instance
lmptr = c_void_p()

#2 equals RTLD_DI_LINKMAP, pass pointer by reference
dlinfo(libc._handle, 2, byref(lmptr))

#typecast to a linkmap pointer and retrieve the name.
abspath = cast(lmptr, POINTER(LINKMAP)).contents.l_name

print(abspath)

关于python - 在Python中获取共享库的绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682600/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com