aboutsummaryrefslogtreecommitdiff
path: root/depfixer.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-10-04 23:04:26 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2013-10-04 23:04:26 +0300
commit3673791b4f7d8fbc290629b1173fff91d7aee781 (patch)
tree369732a900d2a15e8e0e3de8506b3fbfb7dc6a6c /depfixer.py
parent2e656bce021e22113014470d2ef04ae46ff938c9 (diff)
downloadmeson-3673791b4f7d8fbc290629b1173fff91d7aee781.zip
meson-3673791b4f7d8fbc290629b1173fff91d7aee781.tar.gz
meson-3673791b4f7d8fbc290629b1173fff91d7aee781.tar.bz2
Rpaths start working.
Diffstat (limited to 'depfixer.py')
-rwxr-xr-xdepfixer.py33
1 files changed, 28 insertions, 5 deletions
diff --git a/depfixer.py b/depfixer.py
index 026fc30..c93d58c 100755
--- a/depfixer.py
+++ b/depfixer.py
@@ -187,6 +187,17 @@ class Elf():
self.bf.seek(strtab.val + soname.val)
print(self.read_str())
+ def get_rpath_offset(self):
+ sec = self.find_section(b'.dynstr')
+ for i in self.dynamic:
+ if i.d_tag == DT_RPATH:
+ rpath = i
+ return sec.sh_offset + rpath.val
+
+ def print_rpath(self):
+ self.bf.seek(self.get_rpath_offset())
+ print(self.read_str())
+
def print_deps(self):
sec = self.find_section(b'.dynstr')
deps = []
@@ -217,14 +228,26 @@ class Elf():
self.bf.seek(offset)
self.bf.write(newname)
+ def fix_rpath(self, new_rpath):
+ rp_off = self.get_rpath_offset()
+ self.bf.seek(rp_off)
+ old_rpath = self.read_str()
+ if len(old_rpath) < len(new_rpath):
+ print("New rpath must not be longer than the old one.")
+ self.bf.seek(rp_off)
+ self.bf.write(new_rpath)
+ self.bf.write(b'\0'*(len(old_rpath) - len(new_rpath) + 1))
if __name__ == '__main__':
- if len(sys.argv) != 3:
- print('This application converts absolute dep paths to relative ones.')
+ if len(sys.argv) < 2 or len(sys.argv) > 3:
+ print('This application resets target rpath.')
print('Don\'t run this unless you know what you are doing.')
print('%s: <binary file> <prefix>' % sys.argv[0])
exit(1)
e = Elf(sys.argv[1])
- prefix = sys.argv[2]
- #e.print_deps()
- e.fix_deps(prefix.encode())
+ if len(sys.argv) == 2:
+ e.print_rpath()
+ else:
+ new_rpath = sys.argv[2]
+ e.fix_rpath(new_rpath.encode('utf8'))
+ #e.fix_deps(prefix.encode())