@@ -216,10 +216,10 @@ def __init__(self, ql: 'R2Qiling', baseaddr=(1 << 64) - 1, loadaddr=0):
216216 self .loadaddr = loadaddr # r2 -m [addr] map file at given address
217217 self .analyzed = False
218218 self ._r2c = libr .r_core .r_core_new ()
219- if ql . code :
220- self ._setup_code (ql . code )
221- else :
222- self ._setup_file (ql .path )
219+ self . _r2i = ctypes . cast ( self . _r2c . contents . io , ctypes . POINTER ( libr . r_io . struct_r_io_t ))
220+ self ._setup_mem (ql )
221+ if ql . code is None : # ql is initialized with file
222+ self ._load_symbol_from_file (ql .path )
223223
224224 def _qlarch2r (self , archtype : QL_ARCH ) -> str :
225225 return {
@@ -253,13 +253,27 @@ def _setup_mem(self, ql: 'R2Qiling'):
253253 self ._cmd (f"e,asm.arch={ arch } ,asm.bits={ ql .arch .bits } " )
254254 self ._cmd ("oba" ) # load bininfo and update flags
255255
256- def _cmd (self , cmd : str ) -> str :
256+ def _load_symbol_from_file (self , path : str ):
257+ r2c = libr .r_core .r_core_new ()
258+ path = path .encode ()
259+ fh = libr .r_core .r_core_file_open (r2c , path , UC_PROT_READ | UC_PROT_EXEC , self .loadaddr )
260+ libr .r_core .r_core_bin_load (r2c , path , self .baseaddr )
261+ symbols = self ._cmdj ("isj" , r2c )
262+ for sym in symbols :
263+ name = sym ['name' ] # name is shoter, but starting with . causes error
264+ name = sym ['flagname' ] if name .startswith ('.' ) else name
265+ if name : # add each symbol as flag if symbol name is not empty
266+ self ._cmd (f"f { name } { sym ['size' ]} @ { sym ['vaddr' ]} " )
267+ libr .r_core_free (r2c )
268+
269+ def _cmd (self , cmd : str , r2c = None ) -> str :
270+ r2c = r2c or self ._r2c
257271 r = libr .r_core .r_core_cmd_str (
258- self . _r2c , ctypes .create_string_buffer (cmd .encode ("utf-8" )))
272+ r2c , ctypes .create_string_buffer (cmd .encode ("utf-8" )))
259273 return ctypes .string_at (r ).decode ('utf-8' )
260274
261- def _cmdj (self , cmd : str ) -> Union [Dict , List [Dict ]]:
262- return json .loads (self ._cmd (cmd ))
275+ def _cmdj (self , cmd : str , r2c = None ) -> Union [Dict , List [Dict ]]:
276+ return json .loads (self ._cmd (cmd , r2c ))
263277
264278 @property
265279 def offset (self ) -> int :
0 commit comments