aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-02-03 17:30:26 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-02-03 17:30:26 +0200
commiteae83aea613d919b8dfc2fb907db5420a321b049 (patch)
treeaa2aa7592643cbcd0ee0864c4e8f2efb93079f75
parentbbd97026d5f79c91075422b30ac0e186a7cc9bf6 (diff)
downloadmeson-eae83aea613d919b8dfc2fb907db5420a321b049.zip
meson-eae83aea613d919b8dfc2fb907db5420a321b049.tar.gz
meson-eae83aea613d919b8dfc2fb907db5420a321b049.tar.bz2
Elf dependency eraser finally works.
-rwxr-xr-xdepfixer.py32
1 files changed, 28 insertions, 4 deletions
diff --git a/depfixer.py b/depfixer.py
index 42fda21..bdc9035 100755
--- a/depfixer.py
+++ b/depfixer.py
@@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+
import sys, struct
SHT_STRTAB = 3
@@ -54,7 +55,7 @@ class Elf():
def __init__(self, bfile):
self.bfile = bfile
- self.bf = open(bfile, 'rb')
+ self.bf = open(bfile, 'r+b')
self.parse_header()
self.parse_sections()
self.parse_dynamic()
@@ -141,9 +142,32 @@ class Elf():
name = self.read_str()
print(name)
+ def fix_deps(self, prefix):
+ 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()
+ if name.startswith(prefix):
+ basename = name.split(b'/')[-1]
+ padding = b'\0'*(len(name) - len(basename))
+ newname = basename + padding
+ assert(len(newname) == len(name))
+ self.bf.seek(offset)
+ self.bf.write(newname)
+
+
if __name__ == '__main__':
- if len(sys.argv) != 2:
- print('%s: <binary file>' % sys.argv[0])
+ if len(sys.argv) != 3:
+ print('This application converts absolute dep paths to relative ones.')
+ 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])
- e.print_deps()
+ prefix = sys.argv[2]
+ #e.print_deps()
+ e.fix_deps(prefix.encode())