aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/scripts/depfixer.py
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-10-13 14:33:57 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-11-09 10:50:59 +0100
commitc2f1d91b8ac8699e48283b4d36c0d1f2510b7586 (patch)
treee53a284089f711c709e5aba9bccca27a64a61009 /mesonbuild/scripts/depfixer.py
parentda522efc937c4747dbc1a43f7cc5c691bde685aa (diff)
downloadmeson-c2f1d91b8ac8699e48283b4d36c0d1f2510b7586.zip
meson-c2f1d91b8ac8699e48283b4d36c0d1f2510b7586.tar.gz
meson-c2f1d91b8ac8699e48283b4d36c0d1f2510b7586.tar.bz2
depfixer: convert unused printing code to debugging functions
When installing with 'meson install --quiet' I'd get the following output: This file does not have an rpath. This file does not have a runpath. (It turns out that of the couple hundred of binaries that are installed, this message was generated for /usr/lib/systemd/boot/efi/linuxx64.elf.stub.) There doesn't seem to be any good reason for this output by default. But those functions can still be used for debugging. Under a debugger, returning the string is just as useful as printing it, but more flexible. So let's suppress printing of anything by default, but keep the extractor functions. The code was somewhat inconsistent wrt. to when .decode() was done. But it seems that we'll get can expect a decodable text string in all cases, so just call .decode() everywhere, because it's nicer to print decoded strings.
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]: