linux: module object extension: Add a function to return the extended ELF symbol information (symbol object and its index) so that doesn't change the get_symbols() interface

This commit is contained in:
Gustavo Moreira
2025-01-30 20:54:38 +11:00
parent f3095513a1
commit 67a83871ad
@@ -212,14 +212,10 @@ class module(generic.GenericIntelProcess):
) )
return elf_table_name return elf_table_name
def get_symbols( def get_symbols_ex(
self, self,
) -> Iterable[Tuple[int, interfaces.objects.ObjectInterface]]: ) -> Iterable[Tuple[int, interfaces.objects.ObjectInterface]]:
"""Get symbols of the module """Get ELF symbol objects and their index for this module"""
Yields:
A tuple containing the ELF symbol index and the corresponding ELF symbol object
"""
if not self.section_strtab or self.num_symtab < 1: if not self.section_strtab or self.num_symtab < 1:
return None return None
@@ -239,10 +235,18 @@ class module(generic.GenericIntelProcess):
subtype=sym_type, subtype=sym_type,
count=self.num_symtab, count=self.num_symtab,
) )
for elf_sym_num, elf_sym_obj in enumerate(elf_syms): for elf_sym_index, elf_sym_obj in enumerate(elf_syms):
# Prepare the symbol object for methods like get_name() # Prepare the symbol object for methods like get_name()
elf_sym_obj.cached_strtab = self.section_strtab elf_sym_obj.cached_strtab = self.section_strtab
yield elf_sym_num, elf_sym_obj yield elf_sym_index, elf_sym_obj
def get_symbols(
self,
) -> Iterable[interfaces.objects.ObjectInterface]:
"""Get ELF symbol objects for this module"""
for _elf_sym_index, elf_sym_obj in self.get_symbols_ex():
yield elf_sym_obj
def get_symbols_names_and_addresses(self) -> Iterable[Tuple[str, int]]: def get_symbols_names_and_addresses(self) -> Iterable[Tuple[str, int]]:
"""Get names and addresses for each symbol of the module """Get names and addresses for each symbol of the module
@@ -251,13 +255,13 @@ class module(generic.GenericIntelProcess):
A tuple for each symbol containing the symbol name and its corresponding value A tuple for each symbol containing the symbol name and its corresponding value
""" """
layer = self._context.layers[self.vol.layer_name] layer = self._context.layers[self.vol.layer_name]
for _sym_num, sym in self.get_symbols(): for elf_sym_obj in self.get_symbols():
sym_name = sym.get_name() sym_name = elf_sym_obj.get_name()
if not sym_name: if not sym_name:
continue continue
# Normalize sym.st_value offset, which is an address pointing to the symbol value # Normalize sym.st_value offset, which is an address pointing to the symbol value
sym_address = sym.st_value & layer.address_mask sym_address = elf_sym_obj.st_value & layer.address_mask
yield (sym_name, sym_address) yield (sym_name, sym_address)
def get_symbol(self, wanted_sym_name) -> Optional[int]: def get_symbol(self, wanted_sym_name) -> Optional[int]: