Skip to content

python-wheel-build/elfdeps

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ELF deps

Python implementation of RPM elfdeps. The elfdeps tool can extract dependencies and provides from an ELF binary.

Example

$ elfdeps --requires /usr/bin/python3.12
libc.so.6(GLIBC_2.34)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libpython3.12.so.1.0()(64bit)
libc.so.6()(64bit)
rtld(GNU_HASH)

$ elfdeps --provides /usr/lib64/libpython3.12.so
libpython3.12.so.1.0()(64bit)
$ elfdeps --provides /lib64/libc.so.6
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.2.6)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
libc.so.6(GLIBC_2.36)(64bit)
libc.so.6(GLIBC_2.38)(64bit)
libc.so.6(GLIBC_ABI_DT_RELR)(64bit)
libc.so.6(GLIBC_PRIVATE)(64bit)
libc.so.6()(64bit)

elfdeps can also inspect archives like Python wheels and extract symbols:

$ elfdeps --symbols torchaudio-2.11.0-cp312-cp312-manylinux_2_28_x86_64.whl
filename: torchaudio/lib/_torchaudio.abi3.so
requires:
  - libgcc_s.so.1(GCC_3.0)(64bit)
  - libc.so.6(GLIBC_2.2.5)(64bit)
  - ...
provides: []
machine: EM_X86_64
is_dso: true
is_exec: true
got_debug: false
got_hash: false
got_gnuhash: true
soname: _torchaudio.abi3.so
exported_symbols:
  - _ZN10torchaudio12cuda_versionEv
  - _ZN10torchaudio18is_align_availableEv
  - ...
imported_symbols:
  - ...
  - aoti_torch_abi_version
  - aoti_torch_delete_library_object
  - ...

RPM

In Fedora-based distributions, RPM packages provide and require virtual packages with ELF sonames and versions. The package manager can install virtual provides.

The python3 base package depends on libpython3.12.so.1.0()(64bit) and libc.so.6(GLIBC_2.34)(64bit):

$ rpm -qR python3
libc.so.6()(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.34)(64bit)
libpython3.12.so.1.0()(64bit)
...
rtld(GNU_HASH)

The python3-libs package virtually provides libpython3.12.so.1.0()(64bit):

$ rpm -qP python3-libs
bundled(libb2) = 0.98.1
libpython3.12.so.1.0()(64bit)
libpython3.so()(64bit)
python-libs = 3.12.3-2.fc39
python3-libs = 3.12.3-2.fc39
python3-libs(x86-64) = 3.12.3-2.fc39
python3.12-libs = 3.12.3-2.fc39
$ sudo dnf install 'libc.so.6(GLIBC_2.34)(64bit)' 'libpython3.12.so.1.0()(64bit)'
Package glibc-2.38-18.fc39.x86_64 is already installed.
Package python3-libs-3.12.3-2.fc39.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

Public API

  • dataclass elfdeps.ELFAnalyzeSettings
  • exception elfdeps.ELFError
  • dataclass elfdeps.ELFInfo
  • dataclass elfdeps.SOInfo
  • elfdeps.analyze_dirtree(dirname, settings=None) -> Generator[ELFInfo, None, None]
  • elfdeps.analyze_elffile(elffile, *, filename, is_exec, settings=None) -> ELFInfo
  • elfdeps.analyze_file(filename, *, settings=None) -> ELFInfo
  • elfdeps.analyze_tarfile(tfile, *, settings=None) -> Generator[ELFInfo, None, None]
  • elfdeps.analyze_tarmember(tfile, tarinfo, *, settings=None) -> ELFInfo
  • elfdeps.analyze_zipfile(zfile, *, settings=None) -> Generator[ELFInfo, None, None]
  • elfdeps.analyze_zipmember(zfile, zipinfo, *, settings=None) -> ELFInfo

About

Python implementation of RPM elfdeps

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages