From b42c0555ca35ebf6e97438ef414a3de62eaa2ced Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Tue, 2 Aug 2016 21:45:45 +0300 Subject: [PATCH] Handle both DT_RPATH as well as DT_RUNPATH when fixing rpath settings. --- mesonbuild/scripts/depfixer.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/mesonbuild/scripts/depfixer.py b/mesonbuild/scripts/depfixer.py index 8ff0dd1..cb136f4 100644 --- a/mesonbuild/scripts/depfixer.py +++ b/mesonbuild/scripts/depfixer.py @@ -20,6 +20,7 @@ SHT_STRTAB = 3 DT_NEEDED = 1 DT_RPATH = 15 +DT_RUNPATH = 29 DT_STRTAB = 5 DT_SONAME = 14 @@ -211,21 +212,29 @@ def print_soname(self): self.bf.seek(strtab.val + soname.val) print(self.read_str()) - def get_rpath_offset(self): + def get_entry_offset(self, entrynum): sec = self.find_section(b'.dynstr') for i in self.dynamic: - if i.d_tag == DT_RPATH: + if i.d_tag == entrynum: return sec.sh_offset + i.val return None def print_rpath(self): - offset = self.get_rpath_offset() + 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()) + def print_runpath(self): + 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()) + def print_deps(self): sec = self.find_section(b'.dynstr') deps = [] @@ -257,9 +266,15 @@ def fix_deps(self, prefix): self.bf.write(newname) def fix_rpath(self, new_rpath): + # The path to search for can be either rpath or runpath. + # Fix both of them to be sure. + self.fix_rpathtype_entry(new_rpath, DT_RPATH) + self.fix_rpathtype_entry(new_rpath, DT_RUNPATH) + + def fix_rpathtype_entry(self, new_rpath, entrynum): if isinstance(new_rpath, str): new_rpath = new_rpath.encode('utf8') - rp_off = self.get_rpath_offset() + rp_off = self.get_entry_offset(entrynum) if rp_off is None: if self.verbose: print('File does not have rpath. It should be a fully static executable.') @@ -272,12 +287,12 @@ def fix_rpath(self, new_rpath): self.bf.write(new_rpath) self.bf.write(b'\0'*(len(old_rpath) - len(new_rpath) + 1)) if len(new_rpath) == 0: - self.remove_rpath_entry() + self.remove_rpath_entry(entrynum) - def remove_rpath_entry(self): + def remove_rpath_entry(self, entrynum): sec = self.find_section(b'.dynamic') for (i, entry) in enumerate(self.dynamic): - if entry.d_tag == DT_RPATH: + if entry.d_tag == entrynum: rpentry = self.dynamic[i] rpentry.d_tag = 0 self.dynamic = self.dynamic[:i] + self.dynamic[i+1:] + [rpentry] @@ -296,6 +311,7 @@ def run(args): e = Elf(args[0]) if len(args) == 1: e.print_rpath() + e.print_runpath() else: new_rpath = args[1] e.fix_rpath(new_rpath)