From 767c687f266fdb1f579e3b165f00ce8c43878f4c Mon Sep 17 00:00:00 2001 From: Martin Panter Date: Wed, 12 Feb 2014 03:02:04 +0000 Subject: [PATCH] Add ELFFile.address_offsets() to get file offsets from a memory address --- elftools/elf/elffile.py | 10 +++++++++ test/test_elffile.py | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 test/test_elffile.py diff --git a/elftools/elf/elffile.py b/elftools/elf/elffile.py index ed168cc..320a232 100644 --- a/elftools/elf/elffile.py +++ b/elftools/elf/elffile.py @@ -107,6 +107,16 @@ class ELFFile(object): """ for i in range(self.num_segments()): yield self.get_segment(i) + + def address_offsets(self, start, size=1): + """ Yield a file offset for each ELF segment matching a memory region + """ + end = start + size + for seg in self.iter_segments(): + if (start >= seg['p_vaddr'] and + end <= seg['p_vaddr'] + seg['p_filesz']): + # Region is contained completely within this segment + yield start - seg['p_vaddr'] + seg['p_offset'] def has_dwarf_info(self): """ Check whether this file appears to have debugging information. diff --git a/test/test_elffile.py b/test/test_elffile.py new file mode 100644 index 0000000..662d518 --- /dev/null +++ b/test/test_elffile.py @@ -0,0 +1,50 @@ +#------------------------------------------------------------------------------- +# elftools tests +# +# Eli Bendersky (eliben@gmail.com) +# This code is in the public domain +#------------------------------------------------------------------------------- +try: + import unittest2 as unittest +except ImportError: + import unittest + +from utils import setup_syspath; setup_syspath() +from elftools.elf.elffile import ELFFile + +class TestMap(unittest.TestCase): + def runTest(self): + class MockELF(ELFFile): + __init__ = object.__init__ + def iter_segments(self): + return iter(( + dict(p_vaddr=0x10200, p_filesz=0x200, p_offset=0x100), + dict(p_vaddr=0x10100, p_filesz=0x100, p_offset=0x400), + )) + + elf = MockELF() + + self.assertEqual(tuple(elf.address_offsets(0x10100)), (0x400,)) + self.assertEqual(tuple(elf.address_offsets(0x10120)), (0x420,)) + self.assertEqual(tuple(elf.address_offsets(0x101FF)), (0x4FF,)) + self.assertEqual(tuple(elf.address_offsets(0x10200)), (0x100,)) + self.assertEqual(tuple(elf.address_offsets(0x100FF)), ()) + self.assertEqual(tuple(elf.address_offsets(0x10400)), ()) + + self.assertEqual( + tuple(elf.address_offsets(0x10100, 0x100)), (0x400,)) + self.assertEqual(tuple(elf.address_offsets(0x10100, 4)), (0x400,)) + self.assertEqual(tuple(elf.address_offsets(0x10120, 4)), (0x420,)) + self.assertEqual(tuple(elf.address_offsets(0x101FC, 4)), (0x4FC,)) + self.assertEqual(tuple(elf.address_offsets(0x10200, 4)), (0x100,)) + self.assertEqual(tuple(elf.address_offsets(0x10100, 0x200)), ()) + self.assertEqual(tuple(elf.address_offsets(0x10000, 0x800)), ()) + self.assertEqual(tuple(elf.address_offsets(0x100FC, 4)), ()) + self.assertEqual(tuple(elf.address_offsets(0x100FE, 4)), ()) + self.assertEqual(tuple(elf.address_offsets(0x101FE, 4)), ()) + self.assertEqual(tuple(elf.address_offsets(0x103FE, 4)), ()) + self.assertEqual(tuple(elf.address_offsets(0x10400, 4)), ()) + + +if __name__ == '__main__': + unittest.main() -- 2.30.2