@@ -111,13 +111,8 @@ public boolean added(Program program, AddressSetView set, TaskMonitor monitor, M
111111 int func_name_offset =0 ;
112112 int args =0 ;
113113 try {
114- if (pointer_size ==8 ) {
115- func_addr_value =memory .getLong (func_list_base .add (i *pointer_size *2 ));
116- func_info_offset =memory .getLong (func_list_base .add (i *pointer_size *2 +pointer_size ));
117- }else {
118- func_addr_value =memory .getInt (func_list_base .add (i *pointer_size *2 ));
119- func_info_offset =memory .getInt (func_list_base .add (i *pointer_size *2 +pointer_size ));
120- }
114+ func_addr_value =get_address_value (memory , func_list_base .add (i *pointer_size *2 ), pointer_size );
115+ func_info_offset =get_address_value (memory , func_list_base .add (i *pointer_size *2 +pointer_size ), pointer_size );
121116 long func_entry_value =memory .getInt (base .add (func_info_offset ));
122117 func_name_offset =memory .getInt (base .add (func_info_offset +pointer_size ));
123118 args =memory .getInt (base .add (func_info_offset +pointer_size +4 ));
@@ -150,6 +145,15 @@ int get_pointer_size(Program program) {
150145 return 4 ;
151146 }
152147
148+ long get_address_value (Memory memory , Address address , int size ) throws MemoryAccessException {
149+ if (size ==8 ) {
150+ return memory .getLong (address );
151+ }else if (size ==4 ) {
152+ return memory .getInt (address );
153+ }
154+ return memory .getByte (address );
155+ }
156+
153157 Address get_gopclntab (Program program , TaskMonitor monitor ) {
154158 MemoryBlock gopclntab_section =null ;
155159 for (MemoryBlock mb : program .getMemory ().getBlocks ()) {
@@ -162,16 +166,30 @@ Address get_gopclntab(Program program, TaskMonitor monitor) {
162166 }
163167
164168 byte magic []= {(byte )0xfb ,(byte )0xff ,(byte )0xff ,(byte )0xff };
165- Address find =null ;
169+ Address base =null ;
166170 while (true ) {
167- find =program .getMemory ().findBytes (find , magic , new byte [] {(byte )0xff ,(byte )0xff ,(byte )0xff ,(byte )0xff }, true , monitor );
168- if (find ==null ) {
171+ base =program .getMemory ().findBytes (base , magic , new byte [] {(byte )0xff ,(byte )0xff ,(byte )0xff ,(byte )0xff }, true , monitor );
172+ if (base ==null ) {
169173 break ;
170174 }
171- find =find .add (4 );
175+
176+ int pointer_size =get_pointer_size (program );
177+ Memory memory =program .getMemory ();
178+ Address func_list_base =base .add (8 +pointer_size );
179+ try {
180+ long func_addr_value =get_address_value (memory , func_list_base .add (0 ), pointer_size );
181+ long func_info_offset =get_address_value (memory , func_list_base .add (pointer_size ), pointer_size );
182+ long func_entry_value =memory .getInt (base .add (func_info_offset ));
183+ if (func_addr_value ==func_entry_value )
184+ {
185+ break ;
186+ }
187+ }catch (MemoryAccessException e ) {
188+ }
189+ base =base .add (4 );
172190 }
173191
174- return find ;
192+ return base ;
175193 }
176194
177195 String create_function_name_data (Program program , Address address ) throws CodeUnitInsertionException {
0 commit comments