ELFFile: allow filtering by segment type in iter_segments() (#375)
[pyelftools.git] / test / test_elffile.py
1 #-------------------------------------------------------------------------------
2 # elftools tests
3 #
4 # Eli Bendersky (eliben@gmail.com)
5 # This code is in the public domain
6 #-------------------------------------------------------------------------------
7 import unittest
8 import os
9
10 from elftools.elf.elffile import ELFFile
11
12
13 class TestMap(unittest.TestCase):
14 def test_address_offsets(self):
15 class MockELF(ELFFile):
16 __init__ = object.__init__
17 def iter_segments(self, type=None):
18 if type == 'PT_LOAD':
19 return iter((
20 dict(p_type='PT_LOAD', p_vaddr=0x10200, p_filesz=0x200, p_offset=0x100),
21 dict(p_type='PT_LOAD', p_vaddr=0x10100, p_filesz=0x100, p_offset=0x400),
22 ))
23 else:
24 return iter((
25 dict(p_type='PT_PHDR', p_vaddr=0x10100, p_filesz=0x100, p_offset=0x400),
26 dict(p_type='PT_LOAD', p_vaddr=0x10200, p_filesz=0x200, p_offset=0x100),
27 dict(p_type='PT_LOAD', p_vaddr=0x10100, p_filesz=0x100, p_offset=0x400),
28 ))
29
30 elf = MockELF()
31
32 self.assertEqual(tuple(elf.address_offsets(0x10100)), (0x400,))
33 self.assertEqual(tuple(elf.address_offsets(0x10120)), (0x420,))
34 self.assertEqual(tuple(elf.address_offsets(0x101FF)), (0x4FF,))
35 self.assertEqual(tuple(elf.address_offsets(0x10200)), (0x100,))
36 self.assertEqual(tuple(elf.address_offsets(0x100FF)), ())
37 self.assertEqual(tuple(elf.address_offsets(0x10400)), ())
38
39 self.assertEqual(
40 tuple(elf.address_offsets(0x10100, 0x100)), (0x400,))
41 self.assertEqual(tuple(elf.address_offsets(0x10100, 4)), (0x400,))
42 self.assertEqual(tuple(elf.address_offsets(0x10120, 4)), (0x420,))
43 self.assertEqual(tuple(elf.address_offsets(0x101FC, 4)), (0x4FC,))
44 self.assertEqual(tuple(elf.address_offsets(0x10200, 4)), (0x100,))
45 self.assertEqual(tuple(elf.address_offsets(0x10100, 0x200)), ())
46 self.assertEqual(tuple(elf.address_offsets(0x10000, 0x800)), ())
47 self.assertEqual(tuple(elf.address_offsets(0x100FC, 4)), ())
48 self.assertEqual(tuple(elf.address_offsets(0x100FE, 4)), ())
49 self.assertEqual(tuple(elf.address_offsets(0x101FE, 4)), ())
50 self.assertEqual(tuple(elf.address_offsets(0x103FE, 4)), ())
51 self.assertEqual(tuple(elf.address_offsets(0x10400, 4)), ())
52
53 class TestSectionFilter(unittest.TestCase):
54
55 def test_section_filter(self):
56 with open(os.path.join('test', 'testfiles_for_unittests',
57 'arm_exidx_test.so'), 'rb') as f:
58 elf = ELFFile(f)
59 self.assertEqual(len(list(elf.iter_sections())), 26)
60 self.assertEqual(len(list(elf.iter_sections('SHT_REL'))), 2)
61 self.assertEqual(len(list(elf.iter_sections('SHT_ARM_EXIDX'))), 1)
62 self.assertTrue(elf.has_ehabi_info())
63
64 if __name__ == '__main__':
65 unittest.main()