File: test_dwarf_v5_forms.py

package info (click to toggle)
python-pyelftools 0.32-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 68,964 kB
  • sloc: python: 15,903; ansic: 298; asm: 86; makefile: 24; cpp: 18; sh: 4
file content (52 lines) | stat: -rw-r--r-- 2,085 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# The dwarf_v5_forms.debug file was generated as follows, using gcc 11.2.0 on
# an x86_64 machine.
# $ cat dwarf_v5_forms.c
# int main();
# {
#         char ** val;
#         return 0;
# }
# $ gcc -O0 -gdwarf-5 dwarf_v5_forms.c -o dwarf_v5_forms.debug
# $ strip --only-keep-debug dwarf_v5_forms.debug
import unittest
import os


from elftools.elf.elffile import ELFFile

class TestDWARFV5_forms(unittest.TestCase):

    def test_DW_FORM_implicit_const(self):
        path = os.path.join('test', 'testfiles_for_unittests',
                            'dwarf_v5_forms.debug')
        with open(path, 'rb') as f:
            elffile = ELFFile(f)
            dwarfinfo = elffile.get_dwarf_info()
            # File is very small, so load all DIEs.
            dies = []
            for cu in dwarfinfo.iter_CUs():
                dies.extend(cu.iter_DIEs())
            # Locate the "var" DIE.
            for die in dies:
                # There should be only one
                if (die.tag == "DW_TAG_variable" and
                    die.attributes["DW_AT_name"].value == b'val'):
                        # In the dwarfinfo, it's type is sized using a
                        # DW_FORM_implicit_const: check it is parsed correctly
                        break
            dietype = cu.get_DIE_from_refaddr(die.attributes["DW_AT_type"].value)
            byte_size_attr = dietype.attributes["DW_AT_byte_size"]
            self.assertEqual(byte_size_attr.form, "DW_FORM_implicit_const")
            self.assertEqual(byte_size_attr.value, 8)

    def test_DW_FORM_linestrp(self):
        path = os.path.join('test', 'testfiles_for_unittests',
                            'dwarf_v5_forms.debug')
        with open(path, 'rb') as f:
            elffile = ELFFile(f)
            dwarfinfo = elffile.get_dwarf_info()
            cu = next(dwarfinfo.iter_CUs())
            top_die = cu.get_top_DIE()
            name_attr = top_die.attributes["DW_AT_name"]
            self.assertEqual(name_attr.form, "DW_FORM_line_strp")
            self.assertEqual(name_attr.value, b"dwarf_v5_forms.c")