2424from .os import *
2525from .type import *
2626from .program import *
27+ from .util import *
2728
2829
2930def is_valid_addr (bv , addr ):
@@ -243,9 +244,13 @@ def _convert_bn_type(tinfo: bn.types.Type, cache):
243244 bn .TypeClass .NamedTypeReferenceClass ,
244245 bn .TypeClass .WideCharTypeClass ,
245246 ]:
246- raise UnhandledTypeException (
247- "Unhandled VarArgs, Value, or WideChar type: {}" .format (str (tinfo )), tinfo
248- )
247+ err_type_class = {
248+ bn .TypeClass .VarArgsTypeClass : "VarArgsTypeClass" ,
249+ bn .TypeClass .ValueTypeClass : "ValueTypeClass" ,
250+ bn .TypeClass .NamedTypeReferenceClass : "NamedTypeReferenceClass" ,
251+ bn .TypeClass .WideCharTypeClass : "WideCharTypeClass" ,
252+ }
253+ DEBUG ("WARNING: Unhandled type class {}" .format (err_type_class [tinfo .type_class ]))
249254
250255 else :
251256 raise UnhandledTypeException ("Unhandled type: {}" .format (str (tinfo )), tinfo )
@@ -472,6 +477,10 @@ def visit(self, program, is_definition, add_refs_as_defs):
472477 if not is_definition :
473478 return
474479
480+ # type could be None if type class not handled
481+ if self ._type is None :
482+ return
483+
475484 if isinstance (self ._type , VoidType ):
476485 return
477486
@@ -484,6 +493,11 @@ def visit(self, program, is_definition, add_refs_as_defs):
484493 for ea in range (begin , end ):
485494 br .seek (ea )
486495 seg = bv .get_segment_at (ea )
496+ # _elf_header is getting recovered as variable
497+ # get_segment_at(...) returns None for elf_header
498+ if seg is None :
499+ continue
500+
487501 mem .map_byte (ea , br .read8 (), seg .writable , seg .executable )
488502
489503
@@ -598,6 +612,8 @@ def get_program(*args, **kargs):
598612 return _PROGRAM
599613 assert len (args ) == 1
600614
615+ DEBUG ("Recovering program {}" .format (args [0 ]))
616+
601617 prog = BNProgram (args [0 ])
602618 if "cache" not in kargs or kargs ["cache" ]:
603619 _PROGRAM = prog
0 commit comments