@@ -71,11 +71,11 @@ def get_name(self):
7171 def _get_sect_count (self , grp ):
7272 """Try to determine the number of valid sections"""
7373 arr = self ._context .object (
74- self .get_symbol_table (). name + constants .BANG + "array" ,
74+ self .get_symbol_table_name () + constants .BANG + "array" ,
7575 layer_name = self .vol .layer_name ,
7676 offset = grp .attrs ,
7777 subtype = self ._context .symbol_space .get_type (
78- self .get_symbol_table (). name + constants .BANG + "pointer"
78+ self .get_symbol_table_name () + constants .BANG + "pointer"
7979 ),
8080 count = 25 ,
8181 )
@@ -92,53 +92,94 @@ def get_sections(self):
9292 else :
9393 num_sects = self ._get_sect_count (self .sect_attrs .grp )
9494 arr = self ._context .object (
95- self .get_symbol_table (). name + constants .BANG + "array" ,
95+ self .get_symbol_table_name () + constants .BANG + "array" ,
9696 layer_name = self .vol .layer_name ,
9797 offset = self .sect_attrs .attrs .vol .offset ,
9898 subtype = self ._context .symbol_space .get_type (
99- self .get_symbol_table (). name + constants .BANG + "module_sect_attr"
99+ self .get_symbol_table_name () + constants .BANG + "module_sect_attr"
100100 ),
101101 count = num_sects ,
102102 )
103103
104104 for attr in arr :
105105 yield attr
106106
107- def get_symbols (self ):
108- if symbols .symbol_table_is_64bit (self ._context , self .get_symbol_table ().name ):
109- prefix = "Elf64_"
110- else :
111- prefix = "Elf32_"
107+ def get_elf_table_name (self ):
112108 elf_table_name = intermed .IntermediateSymbolTable .create (
113- self .context ,
114- self . config_path ,
109+ self ._context ,
110+ "config_name_elf_symbol_table" ,
115111 "linux" ,
116112 "elf" ,
117113 native_types = None ,
118114 class_types = elf .class_types ,
119115 )
116+ return elf_table_name
117+
118+ def get_symbols (self ):
119+ """Get symbols of the module
120+
121+ Yields:
122+ A symbol object
123+ """
120124
125+ if not hasattr (self , "_elf_table_name" ):
126+ self ._elf_table_name = self .get_elf_table_name ()
127+ if symbols .symbol_table_is_64bit (self ._context , self .get_symbol_table_name ()):
128+ prefix = "Elf64_"
129+ else :
130+ prefix = "Elf32_"
121131 syms = self ._context .object (
122- self .get_symbol_table (). name + constants .BANG + "array" ,
132+ self .get_symbol_table_name () + constants .BANG + "array" ,
123133 layer_name = self .vol .layer_name ,
124134 offset = self .section_symtab ,
125135 subtype = self ._context .symbol_space .get_type (
126- elf_table_name + constants .BANG + prefix + "Sym"
136+ self . _elf_table_name + constants .BANG + prefix + "Sym"
127137 ),
128138 count = self .num_symtab + 1 ,
129139 )
130140 if self .section_strtab :
131141 for sym in syms :
132- sym .set_cached_strtab (self .section_strtab )
133142 yield sym
134143
135- def get_symbol (self , wanted_sym_name ):
136- """Get value for a given symbol name"""
144+ def get_symbols_names_and_addresses (self ) -> Tuple [str , int ]:
145+ """Get names and addresses for each symbol of the module
146+
147+ Yields:
148+ A tuple for each symbol containing the symbol name and its corresponding value
149+ """
150+
137151 for sym in self .get_symbols ():
138- sym_name = sym .get_name ()
139- sym_addr = sym .st_value
152+ sym_arr = self ._context .object (
153+ self .get_symbol_table_name () + constants .BANG + "array" ,
154+ layer_name = self .vol .native_layer_name ,
155+ offset = self .section_strtab + sym .st_name ,
156+ )
157+ try :
158+ sym_name = utility .array_to_string (
159+ sym_arr , 512
160+ ) # 512 is the value of KSYM_NAME_LEN kernel constant
161+ except exceptions .InvalidAddressException :
162+ continue
163+ if sym_name != "" :
164+ # Normalize sym.st_value offset, which is an address pointing to the symbol value
165+ mask = self ._context .layers [self .vol .layer_name ].address_mask
166+ sym_address = sym .st_value & mask
167+ yield (sym_name , sym_address )
168+
169+ def get_symbol (self , wanted_sym_name ):
170+ """Get symbol value for a given symbol name"""
171+ for sym_name , sym_address in self .get_symbols_names_and_addresses ():
140172 if wanted_sym_name == sym_name :
141- return sym_addr
173+ return sym_address
174+
175+ return None
176+
177+ def get_symbol_by_address (self , wanted_sym_address ):
178+ """Get symbol name for a given symbol address"""
179+ for sym_name , sym_address in self .get_symbols_names_and_addresses ():
180+ if wanted_sym_address == sym_address :
181+ return sym_name
182+
142183 return None
143184
144185 @property
@@ -1132,7 +1173,7 @@ def get_devname(self) -> str:
11321173class kobject (objects .StructType ):
11331174 def reference_count (self ):
11341175 refcnt = self .kref .refcount
1135- if self .has_member ("counter" ):
1176+ if refcnt .has_member ("counter" ):
11361177 ret = refcnt .counter
11371178 else :
11381179 ret = refcnt .refs .counter
0 commit comments