1919SHF_WRITE_ALLOC = SHF_WRITE | SHF_ALLOC
2020SHF_ALLOC_EXEC = SHF_ALLOC | SHF_EXEC
2121
22+
2223# Must match enum in thread_info.c
2324class ThreadInfoOffset (IntEnum ):
2425 THREAD_INFO_OFFSET_VERSION = 0
@@ -44,7 +45,7 @@ def __int__(self):
4445logger = logging .getLogger ("parser" )
4546
4647
47- class CoredumpElfFile () :
48+ class CoredumpElfFile :
4849 """
4950 Class to parse ELF file for memory content in various sections.
5051 There are read-only sections (e.g. text and rodata) where
@@ -78,7 +79,11 @@ def has_kernel_thread_info(self):
7879 return self .kernel_thread_info_offsets is not None
7980
8081 def get_kernel_thread_info_offset (self , thread_info_offset_index ):
81- if self .has_kernel_thread_info () and thread_info_offset_index <= ThreadInfoOffset .THREAD_INFO_OFFSET_T_ARC_RELINQUISH_CAUSE :
82+ if (
83+ self .has_kernel_thread_info ()
84+ and thread_info_offset_index
85+ <= ThreadInfoOffset .THREAD_INFO_OFFSET_T_ARC_RELINQUISH_CAUSE
86+ ):
8287 return self .kernel_thread_info_offsets [thread_info_offset_index ]
8388 else :
8489 return None
@@ -96,14 +101,20 @@ def parse(self):
96101 for section in self .elf .iter_sections ():
97102 # Find symbols for _kernel_thread_info data
98103 if isinstance (section , elftools .elf .sections .SymbolTableSection ):
99- _kernel_thread_info_offsets = section .get_symbol_by_name ("_kernel_thread_info_offsets" )
100- _kernel_thread_info_num_offsets = section .get_symbol_by_name ("_kernel_thread_info_num_offsets" )
101- _kernel_thread_info_size_t_size = section .get_symbol_by_name ("_kernel_thread_info_size_t_size" )
104+ _kernel_thread_info_offsets = section .get_symbol_by_name (
105+ "_kernel_thread_info_offsets"
106+ )
107+ _kernel_thread_info_num_offsets = section .get_symbol_by_name (
108+ "_kernel_thread_info_num_offsets"
109+ )
110+ _kernel_thread_info_size_t_size = section .get_symbol_by_name (
111+ "_kernel_thread_info_size_t_size"
112+ )
102113
103114 # REALLY NEED to match exact type as all other sections
104115 # (debug, text, etc.) are descendants where
105116 # isinstance() would match.
106- if type (section ) is not elftools .elf .sections .Section : # pylint: disable=unidiomatic-typecheck
117+ if type (section ) is not elftools .elf .sections .Section : # pylint: disable=unidiomatic-typecheck
107118 continue
108119
109120 size = section ['sh_size' ]
@@ -132,56 +143,80 @@ def parse(self):
132143
133144 if store :
134145 mem_region = {"start" : sec_start , "end" : sec_end , "data" : section .data ()}
135- logger .info ("ELF Section: 0x%x to 0x%x of size %d (%s)" %
136- (mem_region ["start" ],
137- mem_region ["end" ],
138- len (mem_region ["data" ]),
139- sect_desc ))
146+ logger .info (
147+ "ELF Section: 0x%x to 0x%x of size %d (%s)"
148+ % (mem_region ["start" ], mem_region ["end" ], len (mem_region ["data" ]), sect_desc )
149+ )
140150
141151 self .memory_regions .append (mem_region )
142152
143- if _kernel_thread_info_size_t_size is not None and \
144- _kernel_thread_info_num_offsets is not None and \
145- _kernel_thread_info_offsets is not None :
153+ if (
154+ _kernel_thread_info_size_t_size is not None
155+ and _kernel_thread_info_num_offsets is not None
156+ and _kernel_thread_info_offsets is not None
157+ ):
146158 for seg in self .elf .iter_segments ():
147159 if seg .header ['p_type' ] != 'PT_LOAD' :
148160 continue
149161
150162 # Store segment of kernel_thread_info_offsets
151163 info_offsets_symbol = _kernel_thread_info_offsets [0 ]
152- if info_offsets_symbol ['st_value' ] >= seg ['p_vaddr' ] and info_offsets_symbol ['st_value' ] < seg ['p_vaddr' ] + seg ['p_filesz' ]:
164+ if (
165+ info_offsets_symbol ['st_value' ] >= seg ['p_vaddr' ]
166+ and info_offsets_symbol ['st_value' ] < seg ['p_vaddr' ] + seg ['p_filesz' ]
167+ ):
153168 kernel_thread_info_offsets_segment = seg
154169
155170 # Store segment of kernel_thread_info_num_offsets
156171 num_offsets_symbol = _kernel_thread_info_num_offsets [0 ]
157- if num_offsets_symbol ['st_value' ] >= seg ['p_vaddr' ] and num_offsets_symbol ['st_value' ] < seg ['p_vaddr' ] + seg ['p_filesz' ]:
172+ if (
173+ num_offsets_symbol ['st_value' ] >= seg ['p_vaddr' ]
174+ and num_offsets_symbol ['st_value' ] < seg ['p_vaddr' ] + seg ['p_filesz' ]
175+ ):
158176 kernel_thread_info_num_offsets_segment = seg
159177
160178 # Read and store size_t size
161179 size_t_size_symbol = _kernel_thread_info_size_t_size [0 ]
162- if size_t_size_symbol ['st_value' ] >= seg ['p_vaddr' ] and size_t_size_symbol ['st_value' ] < seg ['p_vaddr' ] + seg ['p_filesz' ]:
180+ if (
181+ size_t_size_symbol ['st_value' ] >= seg ['p_vaddr' ]
182+ and size_t_size_symbol ['st_value' ] < seg ['p_vaddr' ] + seg ['p_filesz' ]
183+ ):
163184 offset = size_t_size_symbol ['st_value' ] - seg ['p_vaddr' ] + seg ['p_offset' ]
164185 self .elf .stream .seek (offset )
165- self .kernel_thread_info_size_t_size = struct .unpack ('B' , self .elf .stream .read (size_t_size_symbol ['st_size' ]))[0 ]
186+ self .kernel_thread_info_size_t_size = struct .unpack (
187+ 'B' , self .elf .stream .read (size_t_size_symbol ['st_size' ])
188+ )[0 ]
166189
167190 struct_format = "I"
168191 if self .kernel_thread_info_size_t_size == 8 :
169192 struct_format = "Q"
170193
171194 # Read and store count of offset values
172195 num_offsets_symbol = _kernel_thread_info_num_offsets [0 ]
173- offset = num_offsets_symbol ['st_value' ] - kernel_thread_info_num_offsets_segment ['p_vaddr' ] + kernel_thread_info_num_offsets_segment ['p_offset' ]
196+ offset = (
197+ num_offsets_symbol ['st_value' ]
198+ - kernel_thread_info_num_offsets_segment ['p_vaddr' ]
199+ + kernel_thread_info_num_offsets_segment ['p_offset' ]
200+ )
174201 self .elf .stream .seek (offset )
175- self .kernel_thread_info_num_offsets = struct .unpack (struct_format , self .elf .stream .read (num_offsets_symbol ['st_size' ]))[0 ]
202+ self .kernel_thread_info_num_offsets = struct .unpack (
203+ struct_format , self .elf .stream .read (num_offsets_symbol ['st_size' ])
204+ )[0 ]
176205
177206 array_format = ""
178207 for _ in range (self .kernel_thread_info_num_offsets ):
179208 array_format = array_format + struct_format
180209
181210 # Read and store array of offset values
182211 info_offsets_symbol = _kernel_thread_info_offsets [0 ]
183- offset = info_offsets_symbol ['st_value' ] - kernel_thread_info_offsets_segment ['p_vaddr' ] + kernel_thread_info_offsets_segment ['p_offset' ]
212+ offset = (
213+ info_offsets_symbol ['st_value' ]
214+ - kernel_thread_info_offsets_segment ['p_vaddr' ]
215+ + kernel_thread_info_offsets_segment ['p_offset' ]
216+ )
184217 self .elf .stream .seek (offset )
185- self .kernel_thread_info_offsets = struct .unpack (array_format , self .elf .stream .read (info_offsets_symbol ['st_size' ]))
218+ self .kernel_thread_info_offsets = struct .unpack (
219+ array_format , self .elf .stream .read (info_offsets_symbol ['st_size' ])
220+ )
186221
187222 return True
0 commit comments