"""
         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.
 
--- /dev/null
+#-------------------------------------------------------------------------------
+# 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()