aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-05-14 16:53:51 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2015-05-14 16:54:08 +0300
commit4743ad90cf53b3a451f51917f920296512992e52 (patch)
tree3144a56b69a2e6d1a0e96fcbc8ca49f5ad4cb996
parent28476aa719845094b20c9ebb58506da7b514b789 (diff)
downloadmeson-4743ad90cf53b3a451f51917f920296512992e52.zip
meson-4743ad90cf53b3a451f51917f920296512992e52.tar.gz
meson-4743ad90cf53b3a451f51917f920296512992e52.tar.bz2
When new rpath is empty, remove rpath defintion from the dynamic entry table too because an empty rpath is different from a nonexisting one and this causes problems when building rpms. Closes #110.
-rwxr-xr-xdepfixer.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/depfixer.py b/depfixer.py
index 8db7ab6..c240935 100755
--- a/depfixer.py
+++ b/depfixer.py
@@ -52,6 +52,7 @@ def init_datasizes(self, ptrsize, is_le):
class DynamicEntry():
def __init__(self, ifile, ptrsize, is_le):
init_datasizes(self, ptrsize, is_le)
+ self.ptrsize = ptrsize
if ptrsize == 64:
self.d_tag = struct.unpack(self.Sxword, ifile.read(self.SxwordSize))[0];
self.val = struct.unpack(self.XWord, ifile.read(self.XWordSize))[0];
@@ -59,6 +60,14 @@ class DynamicEntry():
self.d_tag = struct.unpack(self.Sword, ifile.read(self.SwordSize))[0]
self.val = struct.unpack(self.Word, ifile.read(self.WordSize))[0]
+ def write(self, ofile):
+ if self.ptrsize == 64:
+ ofile.write(struct.pack(self.Sxword, self.d_tag))
+ ofile.write(struct.pack(self.XWord, self.val))
+ else:
+ ofile.write(struct.pack(self.Sword, self.d_tag))
+ ofile.write(struct.pack(self.Word, self.val))
+
class SectionHeader():
def __init__(self, ifile, ptrsize, is_le):
init_datasizes(self, ptrsize, is_le)
@@ -259,6 +268,21 @@ class Elf():
self.bf.seek(rp_off)
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()
+
+ def remove_rpath_entry(self):
+ sec = self.find_section(b'.dynamic')
+ for (i, entry) in enumerate(self.dynamic):
+ if entry.d_tag == DT_RPATH:
+ rpentry = self.dynamic[i]
+ rpentry.d_tag = 0
+ self.dynamic = self.dynamic[:i] + self.dynamic[i+1:] + [rpentry]
+ break;
+ self.bf.seek(sec.sh_offset)
+ for entry in self.dynamic:
+ entry.write(self.bf)
+ return None
if __name__ == '__main__':
if len(sys.argv) < 2 or len(sys.argv) > 3: