aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/scripts/depfixer.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/scripts/depfixer.py')
-rw-r--r--mesonbuild/scripts/depfixer.py54
1 files changed, 23 insertions, 31 deletions
diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py
index bdcdfca..b86fed9 100644
--- a/mesonbuild/scripts/depfixer.py
+++ b/mesonbuild/scripts/depfixer.py
@@ -21,7 +21,7 @@ import shutil
import subprocess
import typing as T
-from ..mesonlib import OrderedSet
+from ..mesonlib import OrderedSet, generate_list
SHT_STRTAB = 3
DT_NEEDED = 1
@@ -243,14 +243,14 @@ class Elf(DataSizes):
if e.d_tag == 0:
break
- def print_section_names(self) -> None:
+ @generate_list
+ def get_section_names(self) -> T.Generator[str, None, None]:
section_names = self.sections[self.e_shstrndx]
for i in self.sections:
self.bf.seek(section_names.sh_offset + i.sh_name)
- name = self.read_str()
- print(name.decode())
+ yield self.read_str().decode()
- def print_soname(self) -> None:
+ def get_soname(self) -> T.Optional[str]:
soname = None
strtab = None
for i in self.dynamic:
@@ -259,10 +259,9 @@ class Elf(DataSizes):
if i.d_tag == DT_STRTAB:
strtab = i
if soname is None or strtab is None:
- print("This file does not have a soname")
- return
+ return None
self.bf.seek(strtab.val + soname.val)
- print(self.read_str())
+ return self.read_str().decode()
def get_entry_offset(self, entrynum: int) -> T.Optional[int]:
sec = self.find_section(b'.dynstr')
@@ -273,33 +272,28 @@ class Elf(DataSizes):
return res
return None
- def print_rpath(self) -> None:
+ def get_rpath(self) -> T.Optional[str]:
offset = self.get_entry_offset(DT_RPATH)
if offset is None:
- print("This file does not have an rpath.")
- else:
- self.bf.seek(offset)
- print(self.read_str())
+ return None
+ self.bf.seek(offset)
+ return self.read_str().decode()
- def print_runpath(self) -> None:
+ def get_runpath(self) -> T.Optional[str]:
offset = self.get_entry_offset(DT_RUNPATH)
if offset is None:
- print("This file does not have a runpath.")
- else:
- self.bf.seek(offset)
- print(self.read_str())
+ return None
+ self.bf.seek(offset)
+ return self.read_str().decode()
- def print_deps(self) -> None:
+ @generate_list
+ def get_deps(self) -> T.Generator[str, None, None]:
sec = self.find_section(b'.dynstr')
- deps = []
for i in self.dynamic:
if i.d_tag == DT_NEEDED:
- deps.append(i)
- for i in deps:
- offset = sec.sh_offset + i.val
- self.bf.seek(offset)
- name = self.read_str()
- print(name)
+ offset = sec.sh_offset + i.val
+ self.bf.seek(offset)
+ yield self.read_str().decode()
def fix_deps(self, prefix: bytes) -> None:
sec = self.find_section(b'.dynstr')
@@ -391,11 +385,9 @@ class Elf(DataSizes):
return None
def fix_elf(fname: str, rpath_dirs_to_remove: T.Set[bytes], new_rpath: T.Optional[bytes], verbose: bool = True) -> None:
- with Elf(fname, verbose) as e:
- if new_rpath is None:
- e.print_rpath()
- e.print_runpath()
- else:
+ if new_rpath is not None:
+ with Elf(fname, verbose) as e:
+ # note: e.get_rpath() and e.get_runpath() may be useful
e.fix_rpath(rpath_dirs_to_remove, new_rpath)
def get_darwin_rpaths_to_remove(fname: str) -> T.List[str]: