在Python程序中获取共享库soname

问题描述 投票:0回答:3

我正在使用 ctypes 为共享 Linux 库编写一个 Python 包装器。有没有某种方法可以以编程方式提取库的soname(例如,可能通过某些库来访问其ELF数据)? (我知道我可以从 objdump 命令的输出中获取此信息,但我很好奇是否可以在不执行系统命令的情况下完成此操作。)

python version shared-libraries elf objdump
3个回答
4
投票

当然,您可以使用

objdump
执行
subprocess
,然后解析其输出以获取 soname,但这正是您想要避免的。不过,这里有一个 shell 示例。

还有 pyelftools 可以看看。据我从文档中看到,它应该能够检索所有必要的数据。


0
投票

想通了;解决方案(使用 pyelftools)发布于here


0
投票

自从上次发帖以来,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
© www.soinside.com 2019 - 2024. All rights reserved.