package Ġcom . ky hs ge ek code . dis assembler Ċ Ċ import Ġandroid . util . Log Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util .* Ċ import Ġnl . l xt reme . bin utils . elf . E lf Ċ import Ġnl . l xt reme . bin utils . elf . E lf Class Ċ import Ġnl . l xt reme . bin utils . elf . Section Type Ċ Ċ class ĠEL F Util ( file : ĠFile , Ġfile c : ĠByteArray ) Ġ: ĠAbstract File () Ġ{ ĊĠĠĠ Ġvar Ġelf : ĠElf ĊĠĠĠ Ġvar Ġinfo Ġ= Ġ"" ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġpublic Ġvoid ĠParse Data () Ġthrows ĠException ĊĠĠĠĠ Ġ{ ĊĠĠĠĠ Ġif Ġ( file Contents Ġ== Ġnull ) ĊĠĠĠĠ Ġ{ ĊĠĠĠĠ Ġreturn ; ĊĠĠĠĠ Ġ} ĊĠĠĠĠ Ġif Ġ( file Contents . length Ġ< Ġ 5 4 ) ĊĠĠĠĠ Ġ{ ĊĠĠĠĠ Ġ// return ; ĊĠĠĠĠ Ġthrow Ġnew ĠException (" Not Ġa ĠEL F ĠHEADER "); ĊĠĠĠĠ Ġ} ĊĠĠĠĠ Ġentry Point Ġ= Ġget Word (( byte ) 0 , Ġ( byte ) 0 , Ġ( byte ) 0 , Ġ( byte ) 0 ); ĊĠĠĠĠ Ġ}*/ Ċ // Ġprivate Ġlong Ġentry Point ; Ċ // Ġprivate Ġbyte Ġ[] Ġfile Contents ; ĊĠĠĠ Ġvar Ġb Executable Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Dis assembler Ġelf util " ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġelf . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( super . toString ()) ĊĠĠĠĠĠĠĠ Ġsb . append ( System . line Separator ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( plt Ġin Ġimport Symbols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( plt ). append ( System . line Separator ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append ( elf . toString ()) Ġ// Ġ. append ( Arrays . toString ( sym strings )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("\ n "). append ( info ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDo Ġsome Ġerror ĊĠĠĠ Ġoverride Ġvar Ġcode Section Base : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Code Ġbase Ġ 0 ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġsome Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠME MO Ġ- ĠElf Ġfile Ġformat Ċ // ĠREL Ċ // ĠREL A Ġhas Ġ( Offset Ġfrom Ġsh _ info ) ĠInfo Ġ( index Ġto Ġsy mt ab Ġat Ġsh _ link , Ġtype ) Ġvalue Ċ // ĠSY MT AB Ċ // ĠD Y NS YM Ċ // ĠSTR TAB ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġafter Constructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsections Ġ= Ġelf . section Headers ĊĠĠĠĠĠĠĠ Ġ// ĠassertNotNull ( Ġsections Ġ); ĊĠĠĠĠĠĠĠ Ġval Ġprogram Headers Ġ= Ġelf . program Headers ĊĠĠĠĠĠĠĠ Ġ// ĠassertNotNull ( Ġprogram Headers Ġ); ĊĠĠĠĠĠĠĠ Ġmachine Type Ġ= Ġelf . header . machine Type ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġelf . header ĊĠĠĠĠĠĠĠ Ġ// ĠassertNotNull ( Ġheader Ġ); ĊĠĠĠĠĠĠĠ Ġif Ġ( header . entry Point Ġ== Ġ 0 L ) Ġ{ Ġ// ĠLog . i ( TAG , Ġ" file Ġ" Ġ+ Ġfile . getName () Ġ+ Ġ" does nt Ġhave Ġentry Ġpoint . Ġcurrently Ġset Ġto Ġ 0 x 3 0 "); Ċ // Ġentry Point Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry Point Ġ= Ġheader . entry Point ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠAn alyze ĠExport Address Table ( Dyn Sym ) ĊĠĠĠĠĠĠĠ Ġif Ġ( elf . dynamic Table Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" size Ġof Ġdynamic Ġtable =" Ġ+ Ġelf . dynamic Table . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr tab Ġ= Ġ 0 L Ġ// Ġpointer Ġto Ġthe Ġstring Ġtable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsym _ cnt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdyn sym buffer Ġ= ĠByteBuffer . wrap ( byte ArrayOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsym buffer Ġ= ĠByteBuffer . wrap ( byte ArrayOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr table Ġ= Ġelf . dynamic String Table ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġelf . get Dynamic Symbol Table (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdyn sy ms Ġ= ĠArrayList < Symbol >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbyte [] Ġsy mt abs = elf . get Dynamic Symbol Table (); Ċ // ĠSy ms Ġhas ĠDyn Sy ms Ċ /* try Ċĉĉ ĉ { Ċĉĉĉ ĉ dyn sym buffer Ġ= Ġelf . get Section ( elf . get Section Header ByType ( Section Type . DY NS YM )); Ċĉĉĉ ĉ E lf Class Ġelf Class = elf . header . elf Class ; Ċĉĉĉ ĉ if Ġ( elf Class . equals ( E lf Class . CLASS _ 3 2 )) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ while Ġ( dyn sym buffer . has Remaining ()) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ int Ġname = dyn sym buffer . getInt () & 0 xFFFFFFFF ; Ċĉĉĉĉĉ ĉ int Ġvalue = dyn sym buffer . getInt () & 0 xFFFFFFFF ; Ċĉĉĉĉĉ ĉ int Ġsize = dyn sym buffer . getInt () & 0 xFFFFFFFF ; Ċĉĉĉĉĉ ĉ short Ġst info = dyn sym buffer . get () & 0 x 7 F ; Ċĉĉĉĉĉ ĉ short Ġst other = dyn sym buffer . get () & 0 x 7 F ; Ċĉĉĉĉĉ ĉ short Ġst sh nd x = dyn sym buffer . get Short (); Ċĉĉĉĉĉ ĉ String Ġsym _ name = E lf . getZ String ( str table , Ġname ); Ċĉĉĉĉĉ ĉ Symbol Ġsymbol = new ĠSymbol (); Ċĉĉĉĉĉ ĉ symbol . name Ġ= Ġsym _ name ; Ċĉĉĉĉĉ ĉ symbol . is 6 4 Ġ= Ġfalse ; Ċĉĉĉĉĉ ĉ symbol . st _ info Ġ= Ġst info ; Ċĉĉĉĉĉ ĉ symbol . st _ name Ġ= Ġname ; Ċĉĉĉĉĉ ĉ symbol . st _ other Ġ= Ġst other ; Ċĉĉĉĉĉ ĉ symbol . st _ sh nd x Ġ= Ġst sh nd x ; Ċĉĉĉĉĉ ĉ symbol . st _ size Ġ= Ġsize ; Ċĉĉĉĉĉ ĉ symbol . st _ value Ġ= Ġvalue ; Ċĉĉĉĉĉ ĉ symbol . analyze (); Ċĉĉĉĉĉ ĉ dyn sy ms . add ( symbol ); Ċĉĉĉĉĉ ĉ / Ġ* sb . append ( sym _ name ). append (" =" ). append ( Integer . to HexString ( value )) Ċĉĉĉĉĉĉ Ġ. append ("; size =" ). append ( size ). append ("; "). append ( st info ). append ("; "). append ( st sh nd x ) Ċĉĉĉĉĉĉ Ġ* Ċĉĉĉĉĉ ĉ sb . append ( symbol . toString ()). append ( System . line Separator ()); Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { // Ġ 6 4 Ċĉĉĉĉ ĉ while Ġ( dyn sym buffer . has Remaining ()) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ int Ġname = dyn sym buffer . getInt (); Ċĉĉĉĉĉ ĉ short Ġst info = dyn sym buffer . get (); Ċĉĉĉĉĉ ĉ short Ġst other = dyn sym buffer . get (); Ċĉĉĉĉĉ ĉ short Ġst sh nd x = dyn sym buffer . get Short (); Ċĉĉĉĉĉ ĉ long Ġvalue = dyn sym buffer . getLong (); Ċĉĉĉĉĉ ĉ long Ġsize = dyn sym buffer . getLong (); Ċĉĉĉĉĉ ĉ String Ġsym _ name = E lf . getZ String ( str table , Ġname ); Ċĉĉĉĉĉ ĉ Symbol Ġsymbol = new ĠSymbol (); Ċĉĉĉĉĉ ĉ symbol . name Ġ= Ġsym _ name ; Ċĉĉĉĉĉ ĉ symbol . is 6 4 Ġ= Ġtrue ; Ċĉĉĉĉĉ ĉ symbol . st _ info Ġ= Ġst info ; Ċĉĉĉĉĉ ĉ symbol . st _ name Ġ= Ġname ; Ċĉĉĉĉĉ ĉ symbol . st _ other Ġ= Ġst other ; Ċĉĉĉĉĉ ĉ symbol . st _ sh nd x Ġ= Ġst sh nd x ; Ċĉĉĉĉĉ ĉ symbol . st _ size Ġ= Ġsize ; Ċĉĉĉĉĉ ĉ symbol . st _ value Ġ= Ġvalue ; Ċĉĉĉĉĉ ĉ symbol . analyze (); Ċĉĉĉĉĉ ĉ dyn sy ms . add ( symbol ); Ċĉĉĉĉĉ ĉ / Ġ* sb . append ( sym _ name ). append (" =" ). append ( Integer . to HexString ( value )) Ċĉĉĉĉĉĉ Ġ. append ("; size =" ). append ( size ). append ("; "). append ( st info ). append ("; "). append ( st sh nd x ) Ċĉĉĉĉĉĉ Ġ* Ċĉĉĉĉĉ ĉ sb . append ( symbol . toString ()). append ( System . line Separator ()); Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( IllegalArgumentException Ġ| IOException Ġe ) Ċĉĉ ĉ { Ċĉĉĉ ĉ Log . e ( TAG , Ġ"", Ġe ); Ċĉĉ ĉ }*/ sb . append ( System . line Separator ()). append (" sy ms ; "). append ( System . line Separator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ( dyn sy ms Ġ!= Ġnull ) Ċ // Ġsymbols . addAll ( dyn sy ms );// I Ġhope Ġthis Ġstatement Ġbe Ġno Ġlonger Ġneeded Ġin Ġthe Ġfuture , Ġas Ġthey Ġmay Ġcontain Ġduplicates Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// First , ĠAn alyze ĠSymbol Ġtable Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠParse Sy mt ab ( sb , Ġstr table ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecond , ĠAn alyze ĠRel a Ġtable Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList < Rel a > Ġrel as Ġ= Ġnew ĠArrayList <>(); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠParse Rel a ( rel as ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Binary ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsort Ġit ? Ġthis Ġshould Ġbe Ġafter Ġplt Ġparse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . sort ( symbols , ĠComparator Ġ{ Ġp 1 , Ġp 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 1 . type Ġ== Ġp 2 . type ) Ġreturn @ Comparator Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 1 . type Ġ== ĠSymbol . Type . ST T _ FUNC ) Ġreturn @ Comparator Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 2 . type Ġ== ĠSymbol . Type . ST T _ FUNC ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sym Ġin Ġsymbols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( sym . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* https :// docs . oracle . com / cd / E 1 9 6 8 3 - 0 1 / 8 1 6 - 1 3 8 6 / 6 m 7 q co bl j / index . html # chapter 6 - 3 5 1 6 6 Ċĉĉĉ ĠSymbol ĠValues Ċĉĉĉ ĠSymbol Ġtable Ġentries Ġfor Ġdifferent Ġobject Ġfile Ġtypes Ġhave Ġslightly Ġdifferent Ġinterpret ations Ġfor Ġthe Ġst _ value Ġmember . Ċĉĉĉ ĠIn Ġre loc atable Ġfiles , Ġst _ value Ġholds Ġalignment Ġconstraints Ġfor Ġa Ġsymbol Ġwhose Ġsection Ġindex Ġis ĠSH N _ COMMON . Ċĉĉĉ ĠIn Ġre loc atable Ġfiles , Ġst _ value Ġholds Ġa Ġsection Ġoffset Ġfor Ġa Ġdefined Ġsymbol . Ġst _ value Ġis Ġan Ġoffset Ġfrom Ġthe Ġbeginning Ġof Ġthe Ġsection Ġthat Ġst _ sh nd x Ġidentifies . Ċĉĉĉ ĠIn Ġexecutable Ġand Ġshared Ġobject Ġfiles , Ġst _ value Ġholds Ġa Ġvirtual Ġaddress . ĠTo Ġmake Ġthese Ġfiles ' Ġsymbols Ġmore Ġuseful Ġfor Ġthe Ġruntime Ġlinker , Ġthe Ġsection Ġoffset Ġ( file Ġinterpretation ) Ġgives Ġway Ġto Ġa Ġvirtual Ġaddress Ġ( memory Ġinterpretation ) Ġfor Ġwhich Ġthe Ġsection Ġnumber Ġis Ġir relevant . Ċĉĉĉ ĠAlthough Ġthe Ġsymbol Ġtable Ġvalues Ġhave Ġsimilar Ġmean ings Ġfor Ġdifferent Ġobject Ġfiles , Ġthe Ġdata Ġallow Ġefficient Ġaccess Ġby Ġthe Ġappropriate Ġprograms . Ċĉĉĉ Ġ*/ Ċ /* https :// github . com / tor val ds / linux / blob / master / include / u api / linux / elf . h Ċĉĉĉ Ġ/ Ġ* Ġ 3 2 - bit ĠEL F Ġbase Ġtypes . Ċĉĉĉ Ġtypedef Ġ__ u 3 2 ĉ E lf 3 2 _ Addr ; Ċĉĉĉ Ġtypedef Ġ__ u 1 6 ĉ E lf 3 2 _ Half ; Ċĉĉĉ Ġtypedef Ġ__ u 3 2 ĉ E lf 3 2 _ Off ; Ċĉĉĉ Ġtypedef Ġ__ s 3 2 ĉ E lf 3 2 _ S word ; Ċĉĉĉ Ġtypedef Ġ__ u 3 2 ĉ E lf 3 2 _ Word ; Ċĉĉĉ Ġ/ Ġ* Ġ 6 4 - bit ĠEL F Ġbase Ġtypes . Ċĉĉĉ Ġtypedef Ġ__ u 6 4 ĉ E lf 6 4 _ Addr ; Ċĉĉĉ Ġtypedef Ġ__ u 1 6 ĉ E lf 6 4 _ Half ; Ċĉĉĉ Ġtypedef Ġ__ s 1 6 ĉ E lf 6 4 _ SH alf ; Ċĉĉĉ Ġtypedef Ġ__ u 6 4 ĉ E lf 6 4 _ Off ; Ċĉĉĉ Ġtypedef Ġ__ s 3 2 ĉ E lf 6 4 _ S word ; Ċĉĉĉ Ġtypedef Ġ__ u 3 2 ĉ E lf 6 4 _ Word ; Ċĉĉĉ Ġtypedef Ġ__ u 6 4 ĉ E lf 6 4 _ X word ; Ċĉĉĉ Ġtypedef Ġ__ s 6 4 ĉ E lf 6 4 _ Sx word ; Ċĉĉĉ Ġ*/ Ċ /* https :// docs . oracle . com / cd / E 1 9 6 8 3 - 0 1 / 8 1 6 - 1 3 8 6 / chapter 6 - 7 9 7 9 7 / index . html Ċĉĉĉ Ġtypedef Ġstruct Ġ{ Ċĉĉĉ ĠElf 3 2 _ Word ĠĠĠĠĠ Ġst _ name ; Ċĉĉĉ ĠElf 3 2 _ Addr ĠĠĠĠĠ Ġst _ value ; Ċĉĉĉ ĠElf 3 2 _ Word ĠĠĠĠĠ Ġst _ size ; Ċĉĉĉ Ġunsigned Ġchar ĠĠ Ġst _ info ; Ċĉĉĉ Ġunsigned Ġchar ĠĠ Ġst _ other ; Ċĉĉĉ ĠElf 3 2 _ Half ĠĠĠĠĠ Ġst _ sh nd x ; Ċĉĉĉ Ġ} ĠElf 3 2 _ Sym ; Ġsize Ġ 1 6 Ċĉĉĉ Ġtypedef Ġstruct Ġ{ Ċĉĉĉ ĠElf 6 4 _ Word ĠĠĠĠĠ Ġst _ name ; Ċĉĉĉ Ġunsigned Ġchar ĠĠ Ġst _ info ; Ċĉĉĉ Ġunsigned Ġchar ĠĠ Ġst _ other ; Ċĉĉĉ ĠElf 6 4 _ Half ĠĠĠĠĠ Ġst _ sh nd x ; Ċĉĉĉ ĠElf 6 4 _ Addr ĠĠĠĠĠ Ġst _ value ; Ċĉĉĉ ĠElf 6 4 _ X word ĠĠĠĠ Ġst _ size ; Ċĉĉĉ Ġ} ĠElf 6 4 _ Sym ; Ġsize Ġ 2 4 Ċĉĉĉ ĠThe Ġelements Ġof Ġthis Ġstructure Ġare : Ċĉĉĉ Ġst _ name Ċĉĉĉ ĠAn Ġindex Ġinto Ġthe Ġobject Ġfile 's Ġsymbol Ġstring Ġtable , Ġwhich Ġholds Ġthe Ġcharacter Ġrepresentations Ġof Ġthe Ġsymbol Ġnames . Ċĉĉĉ ĠIf Ġthe Ġvalue Ġis Ġnon zero , Ġit Ġrepresents Ġa Ġstring Ġtable Ġindex Ġthat Ġgives Ġthe Ġsymbol Ġname . Ċĉĉĉ ĠOtherwise , Ġthe Ġsymbol Ġtable Ġentry Ġhas Ġno Ġname . Ċĉĉĉ Ġst _ value Ċĉĉĉ ĠThe Ġvalue Ġof Ġthe Ġassociated Ġsymbol . ĠDep ending Ġon Ġthe Ġcontext , Ġthis Ġcan Ġbe Ġan Ġabsolute Ġvalue , Ġan Ġaddress , Ġand Ġso Ġforth . ĠSee Ġ" Symbol ĠValues ". Ċĉĉĉ Ġst _ size Ċĉĉĉ ĠMany Ġsymbols Ġhave Ġassociated Ġsizes . ĠFor Ġexample , Ġa Ġdata Ġobject 's Ġsize Ġis Ġthe Ġnumber Ġof Ġbytes Ġcontained Ġin Ġthe Ġobject . ĠThis Ġmember Ġholds Ġ 0 Ġif Ġthe Ġsymbol Ġhas Ġno Ġsize Ġor Ġan Ġunknown Ġsize . Ċĉĉĉ Ġ*/ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer Ġrel Buf Ġ= Ġelf . get Section ( elf . get Section Header ByType ( Section Type . REL )); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠElf Class Ġelf Class Ġ= Ġelf . header . elf Class ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elf Class . equals ( E lf Class . CLASS _ 3 2 )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rel Buf . remaining () Ġ> Ġ 0 ) Ġ{ Ċ /* t Ġy Ġp Ġe Ġd Ġe Ġf Ġs Ġt Ġr Ġu Ġc Ġt Ġ{ Ċĉĉĉĉĉ ĉ E Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠA Ġd Ġd Ġr Ġr Ġ_ Ġo Ġf Ġf Ġs Ġe Ġt Ġ; Ċĉĉĉĉĉ ĉ E Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠW Ġo Ġr Ġd Ġr Ġ_ Ġi Ġn Ġf Ġo Ġ; Ċĉĉĉĉĉ ĉ } ĠE Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠR Ġe Ġl Ġ; Ċĉĉĉĉĉ ĉ t Ġy Ġp Ġe Ġd Ġe Ġf Ġs Ġt Ġr Ġu Ġc Ġt Ġ{ Ċĉĉĉĉĉĉ ĉ E Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠA Ġd Ġd Ġr Ġ Ġr Ġ_ Ġo Ġf Ġf Ġs Ġe Ġt Ġ; Ċĉĉĉĉĉĉ ĉ E Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠW Ġo Ġr Ġd Ġ Ġr Ġ_ Ġi Ġn Ġf Ġo Ġ; Ċĉĉĉĉĉĉ ĉ E Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠS Ġw Ġo Ġr Ġd Ġ Ġr Ġ_ Ġa Ġd Ġd Ġe Ġn Ġd Ġ; Ċĉĉĉĉĉ ĉ } ĠE Ġl Ġf Ġ 3 Ġ 2 Ġ_ ĠR Ġe Ġl Ġa ; Ċĉĉĉĉĉ Ġ# Ġd Ġe Ġf Ġi Ġn Ġe ĠE ĠL ĠF Ġ 3 Ġ 2 Ġ_ ĠR Ġ_ ĠS ĠY ĠM Ġ( Ġi Ġ) Ġ( Ġ( Ġi Ġ) Ġ> Ġ> Ġ 8 Ġ) Ċĉĉĉĉĉ Ġ# Ġd Ġe Ġf Ġi Ġn Ġe ĠE ĠL ĠF Ġ 3 Ġ 2 Ġ_ ĠR Ġ_ ĠT ĠY ĠP ĠE Ġ( Ġi Ġ) Ġ( Ġ( Ġu Ġn Ġs Ġi Ġg Ġn Ġe Ġd Ġc Ġh Ġa Ġr Ġ) Ġ( Ġi Ġ) Ġ) Ċĉĉĉĉĉ Ġ# Ġd Ġe Ġf Ġi Ġn Ġe ĠE ĠL ĠF Ġ 3 Ġ 2 Ġ_ ĠR Ġ_ ĠI ĠN ĠF ĠO Ġ( Ġs Ġ, Ġt Ġ) Ġ( Ġ( Ġ( Ġs Ġ) Ġ< Ġ< Ġ 8 Ġ) Ġ+ Ġ( Ġu Ġn Ġs Ġi Ġg Ġn Ġe Ġd Ġc Ġh Ġa Ġr Ġ) Ġ( Ġt Ġ) Ġ) Ċĉĉĉĉ ĉ */ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġoffset Ġ= Ġrel Buf . getInt (); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġinfo Ġ= Ġrel Buf . getInt (); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġsym idx Ġ= Ġinfo Ġ>> Ġ 8 ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint Ġtype Ġ= Ġinfo Ġ& Ġ 0 x 7 F ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" offset =" Ġ+ ĠInteger . to HexString ( offset ) Ġ+ Ġ" sym idx =" Ġ+ Ġsym idx Ġ+ Ġ"& type =" Ġ+ Ġtype Ġ+ Ġ"& info =" Ġ+ Ġinfo ); Ċ /* Ċĉĉĉĉ ĉ Intel Ċĉĉĉĉĉ ĠName ĠValue Ġ ĠField Ġ ĠCalcul ation Ċĉĉĉĉĉ Ġ_ Ġ__ ________________________________ ________________ Ċĉĉĉĉĉ ĠR _ 3 8 6 _ NONE Ġ 0 Ġnone Ġnone Ċĉĉĉĉĉ ĠR _ 3 8 6 _ 3 2 Ġ 1 Ġword 3 2 ĠS Ġ+ ĠA ĠR _ 3 8 6 _ PC 3 2 ĊĉĉĉĉĉĠ 2 Ġword 3 2 ĠS Ġ+ ĠA Ġ- ĠP ĠR _ 3 8 6 _ G OT 3 2 ĊĉĉĉĉĉĠ 3 Ġword 3 2 ĠG Ġ+ ĠA Ġ- ĠP ĠR _ 3 8 6 _ PL T 3 2 ĊĉĉĉĉĉĠ 4 Ġword 3 2 ĠL Ġ+ ĠA Ġ- ĠP ĠR _ 3 8 6 _ COPY ĊĉĉĉĉĉĠ 5 Ġnone Ġnone ĠR _ 3 8 6 _ GLOB _ DAT ĊĉĉĉĉĉĠ 6 Ġword 3 2 ĠS ĠR _ 3 8 6 _ J MP _ SLOT ĊĉĉĉĉĉĠ 7 Ġword 3 2 ĠS ĠR _ 3 8 6 _ REL ATIVE ĊĉĉĉĉĉĠ 8 Ġword 3 2 ĠB Ġ+ ĠA ĠR _ 3 8 6 _ G OT OFF ĊĉĉĉĉĉĠ 9 Ġword 3 2 ĠS Ġ+ ĠA Ġ- ĠG OT ĠR _ 3 8 6 _ G OT PC ĊĉĉĉĉĉĠ 1 0 Ġword 3 2 ĠG OT Ġ+ ĠA Ġ- ĠP Ċĉĉĉĉĉ Ġ_ Ġ__ ________________________________ ________________ Ċĉĉĉĉĉ ĠTool ĠInterface ĠStandard s Ġ( T IS ) Ġ ĠPort able Ġ ĠForm ats ĠSpecification , ĠVersion Ġ 1 . 1 Ċĉĉĉĉĉ ĠARM Ċĉĉĉĉĉ ĠCode Ġ ĠName ĠType ĠClass ĊĉĉĉĉĉĠ 0 ĠR _ ARM _ NONE ĠStatic ĠOperation ĠMis cellaneous ĊĉĉĉĉĉĠ 1 ĠR _ ARM _ PC 2 4 ĠDeprecated Ġ ĠARM ĊĉĉĉĉĉĠ 2 ĠR _ ARM _ ABS 3 2 ĠStatic Ġ(( ĠS Ġ+ ĠA Ġ) Ġ| ĠT ) P ĠData ĊĉĉĉĉĉĠ 3 ĠR _ ARM _ REL 3 2 ĠStatic Ġ( ĠS Ġ+ ĠA Ġ) Ġ| ĠT ĠData ĊĉĉĉĉĉĠ 4 ĠR _ ARM _ L DR _ PC _ G 0 ĠStatic Ġ(( ĠS Ġ+ ĠA Ġ) Ġ| ĠT ) P ĠARM ĊĉĉĉĉĉĠ 5 ĠR _ ARM _ ABS 1 6 ĠStatic ĠS Ġ+ ĠA ĠP ĠData ĊĉĉĉĉĉĠ 6 ĠR _ ARM Ġ_ ABS 1 2 ĠStatic ĠS Ġ+ ĠA ĠARM ĊĉĉĉĉĉĠ 7 ĠR _ ARM _ TH M _ ABS 5 ĠStatic ĠS Ġ+ ĠA ĠThumb 1 6 ĊĉĉĉĉĉĠ 8 ĠR _ ARM _ ABS 8 ĠStatic ĠS Ġ+ ĠA ĠData ĊĉĉĉĉĉĠ 9 ĠR _ ARM _ SB REL 3 2 ĠStatic ĠS Ġ+ ĠA ĠData Ġ(( ĠS Ġ+ ĠA Ġ) Ġ| ĠT ) B ( S ) ĊĉĉĉĉĉĠ 1 0 ĠR _ ARM _ TH M _ CALL ĠStatic ĠThumb 3 2 Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 1 1 ĠR _ ARM _ TH M _ PC 8 ĠStatic ĠThumb 1 6 ĠS Ġ+ ĠA ĠâĢĵ ĠPa ĊĉĉĉĉĉĠ 1 2 ĠR _ ARM _ B REL _ ADJ ĠDynamic ĠData ĠÎĶ B ( S ) Ġ+ ĠA ĊĉĉĉĉĉĠ 1 3 ĠR _ ARM _ TLS _ DESC ĠDynamic ĠData ĊĉĉĉĉĉĠ 1 4 ĠR _ ARM _ TH M _ SW I 8 ĠOb solete ĠEn codings Ġreserved Ġfor Ġfuture ĠDynamic Ġre locations ĊĉĉĉĉĉĠ 1 5 ĠR _ ARM _ X PC 2 5 ĠOb solete ĊĉĉĉĉĉĠ 1 6 ĠR _ ARM _ TH M _ X PC 2 2 ĠOb solete ĊĉĉĉĉĉĠ 1 7 ĠR _ ARM _ TLS _ D TP MOD 3 2 ĠDynamic ĠData ĠModule [ S ] ĊĉĉĉĉĉĠ 1 8 ĠR _ ARM _ TLS _ DT PO FF 3 2 ĠDynamic ĠData ĠS Ġ+ ĠA ĠâĢĵ ĠTLS ĊĉĉĉĉĉĠ 1 9 ĠR _ ARM _ TLS _ T PO FF 3 2 ĠDynamic ĠData ĠS Ġ+ ĠA ĠâĢĵ Ġtp ĊĉĉĉĉĉĠ 2 0 ĠR _ ARM _ COPY ĠDynamic ĠMis cellaneous ĊĉĉĉĉĉĠ 2 1 ĠR _ ARM _ GLOB _ DAT ĠDynamic ĠData Ġ( S Ġ+ ĠA ) Ġ| ĠT ĊĉĉĉĉĉĠ 2 2 ĠR _ ARM _ JUMP _ SLOT ĠDynamic ĠData Ġ( S Ġ+ ĠA ) Ġ| ĠT ĊĉĉĉĉĉĠ 2 3 ĠR _ ARM _ REL ATIVE ĠDynamic ĠData ĠB ( S ) Ġ+ ĠA Ġ Ġ[ Note : Ġsee ĠTable Ġ 4 - 1 8 ] ĊĉĉĉĉĉĠ 2 4 ĠR _ ARM _ G OT OFF 3 2 ĠStatic ĠData Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠG OT _ ORG ĊĉĉĉĉĉĠ 2 5 ĠR _ ARM _ BASE _ PRE L ĠStatic ĠData ĠB ( S ) Ġ+ ĠA ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 2 6 ĠR _ ARM _ G OT _ B REL ĠStatic ĠData ĠG OT ( S ) Ġ+ ĠA ĠâĢĵ ĠG OT _ ORG ĊĉĉĉĉĉĠ 2 7 ĠR _ ARM _ PL T 3 2 ĠDeprecated ĠARM Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 2 8 ĠR _ ARM _ CALL ĠStatic ĠARM Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 2 9 ĠR _ ARM _ JUMP 2 4 ĠStatic ĠARM Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 3 0 ĠR _ ARM _ TH M _ JUMP 2 4 ĠStatic ĠThumb 3 2 Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 3 1 ĠR _ ARM _ BASE _ ABS ĠStatic ĠData ĠB ( S ) Ġ+ ĠA ĊĉĉĉĉĉĠ 3 2 ĠR _ ARM _ AL U _ P CRE L _ 7 _ 0 ĠOb solete Ġ ĠNote ĠâĢĵ ĠLegacy Ġ( ARM ĠEL F ĠB 0 2 ) Ġnames Ġhave Ġbeen Ġretained Ġfor Ġthese Ġobsolete Ġre locations . ĊĉĉĉĉĉĠ 3 3 ĠR _ ARM _ AL U _ P CRE L _ 1 5 _ 8 ĠOb solete ĊĉĉĉĉĉĠ 3 4 ĠR _ ARM _ AL U _ P CRE L _ 2 3 _ 1 5 ĠOb solete ĊĉĉĉĉĉĠ 3 5 ĠR _ ARM _ L DR _ SB REL _ 1 1 _ 0 _ NC ĠDeprecated ĠARM ĠS Ġ+ ĠA ĠâĢĵ ĠB ( S ) ĊĉĉĉĉĉĠ 3 6 ĠR _ ARM _ AL U _ SB REL _ 1 9 _ 1 2 _ NC ĠDeprecated ĠARM ĠS Ġ+ ĠA ĠâĢĵ ĠB ( S ) ĊĉĉĉĉĉĠ 3 7 ĠR _ ARM _ AL U _ SB REL _ 2 7 _ 2 0 _ CK ĠDeprecated ĠARM ĠS Ġ+ ĠA ĠâĢĵ ĠB ( S ) ĊĉĉĉĉĉĠ 3 8 ĠR _ ARM _ TARGET 1 ĠStatic ĠMis cellaneous Ġ( S Ġ+ ĠA ) Ġ| ĠT Ġor Ġ Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP ĊĉĉĉĉĉĠ 3 9 ĠR _ ARM _ SB REL 3 1 ĠDeprecated ĠData Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠB ( S ) ĊĉĉĉĉĉĠ 4 0 ĠR _ ARM _ V 4 BX ĠStatic ĠMis cellaneous ĊĉĉĉĉĉĠ 4 1 ĠR _ ARM _ TARGET 2 ĠStatic ĠMis cellaneous ĊĉĉĉĉĉĠ 4 2 ĠR _ ARM _ PRE L 3 1 ĠStatic ĠData Ġ(( S Ġ+ ĠA ) Ġ| ĠT ) ĠâĢĵ ĠP Ċĉĉĉĉĉ ĠARM Ġ ĠI HI ĠĠ 0 0 4 4 F ĠCopyright Ġ ĠÂ© ĠĠ 2 0 0 3 - 2 0 0 9 , ĠĠ 2 0 1 2 , ĠĠ 2 0 1 4 - 2 0 1 5 Ġ ĠARM Ġ ĠLimited . Ġ ĠAll Ġ Ġrights Ġ Ġreserved . ĠPage ĠĠ 2 6 Ġ Ġof ĠĠ 4 8 Ċĉĉĉĉĉ ĠTable ĠĠ 4 - 1 8 , Ġ ĠDynamic Ġ Ġre locations Ċĉĉĉĉĉ ĠCode Ġ ĠRe location Ġ ĠComment ĊĉĉĉĉĉĠ 1 7 Ġ( S Ġ Ġâī ł ĠĠ 0 ) ĠR _ ARM _ TLS _ D TP MOD 3 2 ĠRes olves Ġ Ġto Ġthe Ġmodule Ġnumber Ġ Ġof Ġ Ġthe Ġmodule Ġ Ġdefining Ġthe Ġspecified ĠTLS Ġ Ġsymbol , Ġ ĠS . Ġ( S Ġ Ġ= ĠĠ 0 ) Ġ ĠRes olves Ġ Ġto Ġthe Ġmodule Ġnumber Ġ Ġof Ġ Ġthe Ġcurrent Ġ Ġmodule Ġ( ie . Ġ Ġthe Ġmodule Ġcontaining Ġthis Ġ Ġre location ). ĊĉĉĉĉĉĠ 1 8 ĠR _ ARM _ TLS _ DT PO FF 3 2 ĠRes olves Ġ Ġto Ġ Ġthe Ġ Ġindex Ġ Ġof Ġ Ġthe Ġspecified Ġ ĠTLS Ġ Ġsymbol Ġ Ġwithin Ġ Ġits Ġ ĠTLS Ġ Ġblock ĊĉĉĉĉĉĠ 1 9 ĠR _ ARM _ TLS _ T PO FF 3 2 Ġ Ġ( S Ġ Ġâī ł ĠĠ 0 ) Ġ ĠRes olves Ġ Ġto Ġthe Ġ Ġoffset Ġ Ġof Ġ Ġthe Ġspecified ĠTLS Ġ Ġsymbol , Ġ ĠS , Ġ Ġfrom Ġ Ġthe Ġ ĠThread ĠPointer , ĠTP . Ċĉĉĉĉĉĉĉĉĉĉ ĠĠ Ġ( S Ġ Ġ= ĠĠ 0 ) Ġ ĠRes olves Ġ Ġto Ġthe Ġ Ġoffset Ġ Ġof Ġ Ġthe Ġ Ġcurrent Ġ Ġmodule âĢĻ s Ġ ĠTLS Ġ Ġblock Ġ Ġfrom Ġ Ġthe ĠThread ĠPointer , Ġ ĠTP Ċĉĉĉĉĉĉĉĉĉĉ ĠĠ Ġ( the Ġadd end Ġ Ġcontains Ġ Ġthe Ġoffset Ġ Ġof Ġ Ġthe Ġ Ġlocal Ġ Ġsymbol Ġ Ġwithin Ġthe ĠTLS Ġ Ġblock ). ĊĉĉĉĉĉĠ 2 0 ĠR _ ARM _ COPY Ġ ĠSee Ġbelow ĊĉĉĉĉĉĠ 2 1 ĠR _ ARM _ GLOB _ DAT ĠRes olves Ġ Ġto Ġ Ġthe Ġ Ġaddress Ġ Ġof Ġ Ġthe Ġspecified Ġsymbol ĊĉĉĉĉĉĠ 2 2 ĠR _ ARM _ JUMP _ SLOT ĠRes olves Ġ Ġto Ġ Ġthe Ġ Ġaddress Ġ Ġof Ġ Ġthe Ġspecified Ġsymbol ĊĉĉĉĉĉĠ 2 3 ĠR _ ARM _ REL ATIVE Ġ( S Ġ Ġâī ł ĠĠ 0 ) Ġ ĠB ( S ) Ġ Ġresolves Ġ Ġto Ġ Ġthe Ġ Ġdifference Ġbetween Ġ Ġthe Ġ Ġaddress Ġ Ġat Ġ Ġwhich Ġthe Ġsegment Ġ Ġdefining Ġthe Ġsymbol Ġ ĠS Ġ Ġwas Ġ Ġloaded Ġ Ġand Ġthe Ġaddress Ġ Ġat Ġ Ġwhich Ġit Ġ Ġwas Ġlinked . Ġl Ċĉĉĉĉĉĉĉĉ ĠĠĠĠĠĠ Ġ( S Ġ= ĠĠ 0 ) Ġ ĠB ( S ) Ġ Ġresolves Ġ Ġto Ġ Ġthe Ġ Ġdifference Ġbetween Ġ Ġthe Ġ Ġaddress Ġ Ġat Ġ Ġwhich Ġthe Ġsegment Ġ Ġbeing Ġre located Ġ Ġwas Ġ Ġloaded Ġ Ġand Ġthe Ġaddress Ġ Ġat Ġ Ġwhich Ġit Ġ Ġwas Ġ Ġlinked Ċĉĉĉĉ ĉ */ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠNow Ġprepare ĠI AT ( PL T / G OT ) Ċ // Ġget Ġ. got Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( Section Header Ġhdr Ġ: Ġsections ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ". plt ". equalsIgnoreCase ( hdr . getName ())) Ġ{ Ċ // Ġplt Ġis Ġcode Ċ // Ġ ĉĉĉĉĉ Ġ 0 0 0 1 7 3 ec Ġ__ android _ log _ print @ plt : Ċ // Ġ ĉĉĉĉĉ Ġ 1 7 3 ec : ĠĠĠĠĠĠ Ġe 2 8 fc 6 0 0 ĠĠĠĠĠĠĠ Ġadd ĠĠĠĠ Ġip , Ġpc , Ġ# 0 , Ġ 1 2 Ġ Ġ; Ġip != pc ? Ċ // Ġ ĉĉĉĉĉ Ġ 1 7 3 f 0 : ĠĠĠĠĠĠ Ġe 2 8 cca 1 1 ĠĠĠĠĠĠĠ Ġadd ĠĠĠĠ Ġip , Ġip , Ġ# 6 9 6 3 2 Ġ Ġ; Ġaddr Ġof Ġgot ? Ċ // Ġ ĉĉĉĉĉ Ġ 1 7 3 f 4 : ĠĠĠĠĠĠ Ġe 5 bcf 9 f 4 ĠĠĠĠĠĠĠ Ġl dr ĠĠĠĠ Ġpc , Ġ[ ip , Ġ# 2 5 4 8 ] !; Ġindex = 2 5 4 8 Ċ // Ġ ĉĉĉĉĉĉ Ġ 0 0 0 1 7 3 f 8 Ġsleep @ plt : Ċ // Ġ ĉĉĉĉĉ Ġ 1 7 3 f 8 : ĠĠĠĠĠĠ Ġe 2 8 fc 6 0 0 ĠĠĠĠĠĠĠ Ġadd ĠĠĠĠ Ġip , Ġpc , Ġ# 0 , Ġ 1 2 Ċ // Ġ ĉĉĉĉĉ Ġ 1 7 3 fc : ĠĠĠĠĠĠ Ġe 2 8 cca 1 1 ĠĠĠĠĠĠĠ Ġadd ĠĠĠĠ Ġip , Ġip , Ġ# 6 9 6 3 2 Ċ // Ġ ĉĉĉĉĉ Ġ 1 7 4 0 0 : ĠĠĠĠĠĠ Ġe 5 bcf 9 ec ĠĠĠĠĠĠĠ Ġl dr ĠĠĠĠ Ġpc , Ġ[ ip , Ġ# 2 5 4 0 ] ! Ċ // Ġ ĉĉĉĉĉ Ġ... Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer Ġbuf Ġ= Ġelf . get Section ( hdr ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġdyn sym buffer Ġ= Ġelf . get Section ( elf . get Section Header ByType ( Section Type . PRO GB ITS )); Ċ // Ġimport Symbols = Parse PL T ( path ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= Ġsb . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . i ( TAG , Ġ" info =" Ġ+ Ġinfo ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" Checking Ġcode Ġsection ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( sh Ġin Ġelf . section Headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" type =" Ġ+ Ġsh . type . toString () Ġ+ Ġ" name =" Ġ+ Ġsh . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sh . type Ġ== ĠSection Type . PRO GB ITS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" sh . type . equals ĠPro g bits ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġsh . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" name Ġnon null : name =$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġ". text ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Section Base Ġ= Ġsh . file Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Section Limit Ġ= Ġcode Section Base Ġ+ Ġsh . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Virt Addr Ġ= Ġsh . virtual Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Code Section Base :${ code Section Base . toString ( 1 6 )}, " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠCode Section Limit :${ code Section Limit . toString ( 1 6 )}, " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠCode Virt Addr Ġ: Ġ${ code Virt Addr . toString ( 1 6 )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġprivate Ġlong Ġcode Offset = 0 L ; Ċ // Ġprivate Ġlong Ġcode Limit = 0 L ; Ċ // Ġprivate Ġlong Ġcode Virtual Address = 0 L ; Ċ // ĠString [] Ġsym strings ; ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun ĠParse Rel a ( rel as : ĠArrayList < Rel a >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrel a Sec Ġ= Ġelf . get Section Header ByType ( Section Type . RE LA ) ĊĠĠĠĠĠĠĠ Ġif Ġ( rel a Sec Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrel a Buf Ġ= Ġelf . get Section ( rel a Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Section Ġ= Ġrel a Sec . info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Sy mt ab Ġ= Ġrel a Sec . link ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rel a Buf . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr _ offset Ġ= Ġrel a Buf . long Ġ// Ġunsigned , Ġbyte Ġoffset Ġfrom Ġtarget Section ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr _ info Ġ= Ġrel a Buf . long Ġ// Ġunsigned , Ġindex Ġto Ġsource Sy mt ab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġ( r _ info Ġshr Ġ 3 2 Ġand Ġ- 0 x 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġsymbols [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr _ add end Ġ= Ġrel a Buf . long Ġ// Ġsigned , Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrel a Ġ= ĠRel a () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . target Section Ġ= Ġtarget Section ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . sym section Ġ= Ġsource Sy mt ab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . index Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . symbol Ġ= Ġsymbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . r _ offset Ġ= Ġr _ offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . r _ add end Ġ= Ġr _ add end ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . r _ info Ġ= Ġr _ info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel a . type Ġ= Ġ( r _ info Ġand Ġ- 0 x 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel as . add ( rel a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠParse Sy mt ab ( sb : ĠStringBuilder , Ġstr table : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsym buffer : ĠByteBuffer ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsym buffer Ġ= Ġelf . get Section ( elf . get Section Header ByType ( Section Type . SY MT AB )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelf Class Ġ= Ġelf . header . elf Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elf Class Ġ== ĠElf Class . CLASS _ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( sym buffer . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġsym buffer . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġsym buffer . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsym buffer . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst info Ġ= Ġsym buffer . get (). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst other Ġ= Ġsym buffer . get (). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst sh nd x Ġ= Ġsym buffer . short ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsym _ name Ġ= ĠElf . getZ String ( str table , Ġname . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= ĠSymbol () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . name Ġ= Ġsym _ name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . is 6 4 Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ info Ġ= Ġst info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ name Ġ= Ġname . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ other Ġ= Ġst other ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ sh nd x Ġ= Ġst sh nd x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ size Ġ= Ġsize . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ value Ġ= Ġvalue . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . analyze () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . add ( symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* sb . append ( sym _ name ). append (" =" ). append ( Integer . to HexString ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("; size =" ). append ( size ). append ("; "). append ( st info ). append ("; "). append ( st sh nd x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ sb . append ( symbol . toString ()). append ( System . line Separator ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġ 6 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( sym buffer . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġsym buffer . int ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst info Ġ= Ġsym buffer . get (). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst other Ġ= Ġsym buffer . get (). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst sh nd x Ġ= Ġsym buffer . short ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġsym buffer . long ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsym buffer . long ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsym _ name Ġ= ĠElf . getZ String ( str table , Ġname . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= ĠSymbol () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . name Ġ= Ġsym _ name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . is 6 4 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ info Ġ= Ġst info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ name Ġ= Ġname . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ other Ġ= Ġst other ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ sh nd x Ġ= Ġst sh nd x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ size Ġ= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . st _ value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . analyze () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbols . add ( symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĉ sb . append ( sym _ name ). append (" =" ). append ( Integer . to HexString ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("; size =" ). append ( size ). append ("; "). append ( st info ). append ("; "). append ( st sh nd x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ sb . append ( symbol . toString ()). append ( System . line Separator ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠString Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġexternal Ġfun Ġload Binary ( path : ĠString ?) ĊĠĠĠ Ġfun Ġadd Symbol ( symbol : ĠSymbol ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsymbol . analyze () ĊĠĠĠĠĠĠĠ Ġsymbols . add ( symbol ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġexternal Ġfun ĠDem angle ( mangled : ĠString ?): ĠString ? ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġexternal Ġfun ĠParse PL T ( filepath : ĠString ?): ĠList < PL T ?> ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġelf Ġ= ĠElf ( file ) ĊĠĠĠĠĠĠĠ Ġpath Ġ= Ġfile . path ĊĠĠĠĠĠĠĠ Ġfile Contents Ġ= Ġfile c ĊĠĠĠĠĠĠĠ Ġafter Constructor () ĊĠĠĠ Ġ} Ċ } Ċ