我正在使用 ctypes 为共享 Linux 库编写一个 Python 包装器。有没有某种方法可以以编程方式提取库的soname(例如,可能通过某些库来访问其ELF数据)? (我知道我可以从 objdump 命令的输出中获取此信息,但我很好奇是否可以在不执行系统命令的情况下完成此操作。)
当然,您可以使用
objdump
执行 subprocess
,然后解析其输出以获取 soname,但这正是您想要避免的。不过,这里有一个 shell 示例。
还有 pyelftools 可以看看。据我从文档中看到,它应该能够检索所有必要的数据。
想通了;解决方案(使用 pyelftools)发布于here。
自从上次发帖以来,pyelftools 似乎变得更方便用来提取信息了:
from elftools.elf.elffile import ELFFile
from elftools.elf.dynamic import DynamicSegment
def getsoname(path):
with open(path, 'rb') as f:
ef = ELFFile(f)
try:
dynamic_segment = next(s for s in ef.iter_segments() if isinstance(s, DynamicSegment))
soname_tag = next(t for t in dynamic_segment.iter_tags() if t['d_tag'] == 'DT_SONAME')
return soname_tag.soname
except StopIteration:
return None