1 #------------------------------------------------------------------------------
4 # Maxim Akhmedov (max42@yandex-team.ru)
5 # This code is in the public domain
6 #------------------------------------------------------------------------------
10 from elftools
.elf
.elffile
import ELFFile
11 from elftools
.elf
.segments
import NoteSegment
14 class TestCoreNotes(unittest
.TestCase
):
15 """ This test makes sure than core dump specific
16 sections are properly analyzed.
20 cls
._core
_file
= open(os
.path
.join('test',
21 'testfiles_for_unittests', 'core_linux64.elf'),
24 def test_core_prpsinfo(self
):
25 elf
= ELFFile(self
._core
_file
)
26 for segment
in elf
.iter_segments():
27 if not isinstance(segment
, NoteSegment
):
29 notes
= list(segment
.iter_notes())
30 for note
in segment
.iter_notes():
31 if note
['n_type'] != 'NT_PRPSINFO':
34 self
.assertEqual(desc
['pr_state'], 0)
35 self
.assertEqual(desc
['pr_sname'], b
'R')
36 self
.assertEqual(desc
['pr_zomb'], 0)
37 self
.assertEqual(desc
['pr_nice'], 0)
38 self
.assertEqual(desc
['pr_flag'], 0x400600)
39 self
.assertEqual(desc
['pr_uid'], 1000)
40 self
.assertEqual(desc
['pr_gid'], 1000)
41 self
.assertEqual(desc
['pr_pid'], 23395)
42 self
.assertEqual(desc
['pr_ppid'], 23187)
43 self
.assertEqual(desc
['pr_pgrp'], 23395)
44 self
.assertEqual(desc
['pr_sid'], 23187)
47 b
'coredump_self\x00\x00\x00')
50 b
'./coredump_self foo bar 42 ' + b
'\x00' * (80 - 27))
52 def test_core_nt_file(self
):
54 Test that the parsing of the NT_FILE note within a core file is
56 The assertions are made against the output of eu-readelf.
58 eu-readelf -n core_linux64.elf
62 00400000-00401000 00000000 4096
63 /home/max42/pyelftools/test/coredump_self
64 00600000-00601000 00000000 4096
65 /home/max42/pyelftools/test/coredump_self
66 00601000-00602000 00001000 4096
67 /home/max42/pyelftools/test/coredump_self
68 7fa4593ae000-7fa45956d000 00000000 1830912
69 /lib/x86_64-linux-gnu/libc-2.23.so
70 7fa45956d000-7fa45976d000 001bf000 2097152
71 /lib/x86_64-linux-gnu/libc-2.23.so
72 7fa45976d000-7fa459771000 001bf000 16384
73 /lib/x86_64-linux-gnu/libc-2.23.so
74 7fa459771000-7fa459773000 001c3000 8192
75 /lib/x86_64-linux-gnu/libc-2.23.so
76 7fa459777000-7fa45979d000 00000000 155648
77 /lib/x86_64-linux-gnu/ld-2.23.so
78 7fa45999c000-7fa45999d000 00025000 4096
79 /lib/x86_64-linux-gnu/ld-2.23.so
80 7fa45999d000-7fa45999e000 00026000 4096
81 /lib/x86_64-linux-gnu/ld-2.23.so
84 elf
= ELFFile(self
._core
_file
)
86 for segment
in elf
.iter_segments():
87 if not isinstance(segment
, NoteSegment
):
89 for note
in segment
.iter_notes():
90 if note
['n_type'] != 'NT_FILE':
94 self
.assertEqual(desc
['num_map_entries'], 10)
95 self
.assertEqual(desc
['page_size'], 4096)
96 self
.assertEqual(len(desc
['Elf_Nt_File_Entry']), 10)
97 self
.assertEqual(len(desc
['filename']), 10)
99 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][0],
104 self
.assertEqual(desc
['filename'][0],
105 b
"/home/max42/pyelftools/test/coredump_self")
107 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][1],
112 self
.assertEqual(desc
['filename'][1],
113 b
"/home/max42/pyelftools/test/coredump_self")
115 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][2],
120 self
.assertEqual(desc
['filename'][2],
121 b
"/home/max42/pyelftools/test/coredump_self")
123 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][3],
128 self
.assertEqual(desc
['filename'][3],
129 b
"/lib/x86_64-linux-gnu/libc-2.23.so")
131 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][4],
136 self
.assertEqual(desc
['filename'][4],
137 b
"/lib/x86_64-linux-gnu/libc-2.23.so")
139 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][5],
144 self
.assertEqual(desc
['filename'][5],
145 b
"/lib/x86_64-linux-gnu/libc-2.23.so")
147 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][6],
152 self
.assertEqual(desc
['filename'][6],
153 b
"/lib/x86_64-linux-gnu/libc-2.23.so")
155 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][7],
160 self
.assertEqual(desc
['filename'][7],
161 b
"/lib/x86_64-linux-gnu/ld-2.23.so")
163 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][8],
168 self
.assertEqual(desc
['filename'][8],
169 b
"/lib/x86_64-linux-gnu/ld-2.23.so")
171 self
.validate_nt_file_entry(desc
['Elf_Nt_File_Entry'][9],
176 self
.assertEqual(desc
['filename'][9],
177 b
"/lib/x86_64-linux-gnu/ld-2.23.so")
178 self
.assertTrue(nt_file_found
)
180 def validate_nt_file_entry(self
,
185 expected_page_offset
):
186 self
.assertEqual(entry
.vm_start
, expected_vm_start
)
187 self
.assertEqual(entry
.vm_end
, expected_vm_end
)
188 self
.assertEqual(entry
.page_offset
* page_size
, expected_page_offset
)
191 def tearDownClass(cls
):
192 cls
._core
_file
.close()