
    g2                        d Z ddlZddlZddlmZ  G d dej                  Z G d dej                  Z G d d	ej                  Z G d
 dej                  Z	 G d dej                  Z
 G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&dZ' G d! d"ej(                  Z)e G d# d$                      Z*e G d% d&                      Z+e G d' d(                      Z,e G d) d*                      Z-e G d+ d,                      Z.d-e.d.ed/e/fd0Z0e G d1 d2                      Z1e G d3 d4                      Z2e G d5 d6                      Z3 G d7 d8ej4                  Z5 G d9 d:ej4                  Z6e G d; d<                      Z7d=e7d.efd>Z8e G d? d@                      Z9dAe9d.efdBZ: G dC dDej4                  Z;e G dE dF                      Z<d=e<d.efdGZ=dHe>e?         d/e/fdIZ@e G dJ dK                      ZAdLeAd.efdMZBdS )NzaDefinitions for the executable and linkable file format 'ELF'.
based on file:///usr/include/elf.h    N)	dataclassc                   B    e Zd ZdZ edg          Z edg          ZdS )ElfClasszWord size of the target machine      N)__name__
__module____qualname____doc__bytesBITS_32BITS_64     H/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./elf/structs.pyr   r   	   s2        %%eQCjjGeQCjjGGGr   r   c                   B    e Zd ZdZ edg          Z edg          ZdS )	EndianesszEndianess of the target machiner   r   N)r   r	   r
   r   r   LSBMSBr   r   r   r   r      s2        %%
%**C
%**CCCr   r   c                   ,    e Zd ZdZ eg d          ZdS )
ElfVersionzAlways version 1r   r   r   r   Nr   r	   r
   r   r   CURRENTr   r   r   r   r      s'        eLLL!!GGGr   r   c                   B    e Zd ZdZ edg          Z edg          ZdS )OSABI*Operating system ABI of the target machiner      N)r   r	   r
   r   r   SYSTEM_VLINUXr   r   r   r   r      s2        00uaSzzHE1#JJEEEr   r   c                   z    e Zd ZdZ eddg          Z eddg          Z eddg          Z eddg          ZdS )FileTypezSpecifies the type of the filer   r   r   r   N)	r   r	   r
   r   r   UNKNOWNRELOCATABLE
EXECUTABLESHARED_OBJECTr   r   r   r"   r"      sX        $$eQFmmG%A--K1vJE1a&MMMMMr   r"   c                   `    e Zd ZdZ eddg          Z eddg          Z eddg          ZdS )	TargetISAz%Instruction set of the target machiner   r   >   N)r   r	   r
   r   r   r#   X86X64r   r   r   r(   r(   #   sI        ++eQFmmG
%A--C
%q	

CCCr   r(   c                   *    e Zd ZdZ edg          ZdS )
ABIVersionr   r   Nr   r   r   r   r-   r-   )   s#        00eQCjjGGGr   r-   c                       e Zd ZdZ eg d          Z eg d          Z eg d          Z eg d          Z eg d          Z	dS )Elf32SectionHeaderTypez5Determines what the contents of the section representr   r   r   r   r   )r   r   r   r   )r   r   r   r   )   r   r   r   N)
r   r	   r
   r   r   NULLPROGRAM_DATASYMBOL_TABLESTRING_TABLEr$   r   r   r   r/   r/   -   ss        ;;5D5&&L5&&L5&&L%%%KKKr   r/   c                   F    e Zd ZdZ eg d          Z eg d          ZdS )Elf32ProgramHeaderTypez-Determines what the program header representsr0   r   N)r   r	   r
   r   r   r2   LOADABLEr   r   r   r7   r7   5   s:        335Du\\\""HHHr   r7      4   @       (   r   r   r1   r         c                   &    e Zd ZdZdZdZdZdZdZdS )KnownSectionNamesz.nullz	.shrtrtabz.symtabz.strtabz.textz	.rel.textN)	r   r	   r
   r2   SECTION_HEADER_STRING_TABLEr4   r5   TEXTRELOCATION_TEXTr   r   r   rA   rA   U   s-        D"-LLD!OOOr   rA   c                   x    e Zd ZU dZdZeed<   eed<    edg          Z	e
ed<   ej        Z ed          Zd Zd	S )
ELFIdentifierz:identifies the ELF, goes in the header - AKA char* e_idents   ELF	elf_class	endianessr   os_abi   c                     | j         | j        j        z   | j        j        z   | j        z   | j        j        z   | j        j        z   | j        z   S )N)magicrG   valuerH   versionrI   abi_versionpaddingselfs    r   	__bytes__zELFIdentifier.__bytes__h   s[    zDN004>3GG$,VY]YdYjjmqm}  nD  D  GK  GS  S  	Sr   N)r   r	   r
   r   rL   r   __annotations__r   r   rN   r   r-   r   rO   rP   rS   r   r   r   rF   rF   ]   sz         DDEeQCjjGMMM$KeAhhGS S S S Sr   rF   c                       e Zd ZU dZeed<   eed<   eed<   ej	        Z
eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<   eed<   d ZdS )	ElfHeaderz,provides important information about the ELFelf_identifier	file_type
target_isaentry_pointprogram_header_offsetsection_header_offsetflagself_header_sizeprogram_header_entry_sizeprogram_header_countsection_header_entry_sizesection_header_countsection_header_name_indexc                    | j         j        t          j        k    rd}nd}t	                      }|t	          | j                   z  }|| j        j        z  }|| j        j        z  }|| j        j        z  }|t          j
        || j        | j        | j        | j        | j        | j        | j        | j        | j        | j                  z  }|S )N
LLLIHHHHHH
IIIIHHHHHH)rW   rG   r   r   r   rX   rM   rY   elf_versionstructpackrZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   )rR   formatresults      r   rS   zElfHeader.__bytes__   s    (H,<<<!FF!F%+,,,$.&&$/''$"((&+f&&J *%*%*
, 
, 
	, r   N)r   r	   r
   r   rF   rT   r"   r(   r   r   rg   intrS   r   r   r   rV   rV   l   s         66!!!!$KJJJ""""""""""""    r   rV   c                   j    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   d
 ZdS )Elf32ProgramHeaderz$Defines a segment loaded into memoryheader_typefile_offsetvirtual_addressphysical_address	file_sizememory_sizer]   alignc                     | j         j        t          j        d| j        | j        | j        | j        | j        | j	        | j
                  z   S )NIIIIIII)ro   rM   rh   ri   rp   rq   rr   rs   rt   r]   ru   rQ   s    r   rS   zElf32ProgramHeader.__bytes__   sr     &Y@PRVRfhlh}  @D  @N  PT  P`  bf  bl  nr  nx  *y  *y  y  	yr   N)r   r	   r
   r   r7   rT   rl   rS   r   r   r   rn   rn      s         **''''NNNJJJJJJy y y y yr   rn   c                   &    e Zd ZU ee         ed<   dS )Elf32ProgramHeaderTableentriesN)r   r	   r
   listrn   rT   r   r   r   ry   ry      $         $%%%%%%r   ry   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   ed             Zedefd            ZdS )Elf32SectionHeader
name_indexro   r]   rq   rp   rs   
link_indexinforu   
entry_sizec                  H    t          dt          j        dddddddd
  
        S Nr   )
r   ro   r]   rq   rp   rs   r   r   ru   r   )r~   r/   r2   r   r   r   nullzElf32SectionHeader.null   s:    !05
 
 
 	
r   typec                 4    t          d| dddddddd
  
        S r   )r~   )r   s    r   blank_of_typez Elf32SectionHeader.blank_of_type   s7    !
 
 
 	
r   N)	r   r	   r
   rl   rT   r/   staticmethodr   r   r   r   r   r~   r~      s          OOO''''JJJNNNOOO
IIIJJJOOO
 
 \
 
2 
 
 
 \
 
 
r   r~   headerrG   returnc                    |t           j        k    rd}nd}t          j        d| j                  | j        j        z   t          j        || j        | j        | j	        | j
        | j        | j        | j        | j        	  	        z   S )NLLLLIILLIIIIIIIII)r   r   rh   ri   r   ro   rM   r]   rq   rp   rs   r   r   ru   r   )r   rG   rj   s      r   section_header_to_bytesr      s    H$$$;sF-..k&	 	 r   c                   &    e Zd ZU ee         ed<   dS )Elf32SectionHeaderTablerz   N)r   r	   r
   r{   r~   rT   r   r   r   r   r      r|   r   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   e	d             Z
e	dee         fd            Zd	S )
Sectionnamedatart   r   is_executablec                 h    t          t          j        t                      dt          j        d          S )Nr   F)r   rA   r2   r   r/   )clss    r   r   zSection.null   s%    (-uww;Q;VX]^^^r   namesc                     t           j        }t                      }|D ]+}||                    d          t          dg          z   z  },t	          |          }t
          j        }d}t          |||||          S )Nasciir   F)rA   rB   r   encodelenr/   r5   r   )r   r   r   r   section_namert   r   r   s           r   section_nameszSection.section_names   sy     !<ww! 	> 	>LL''005!::==DD$ii%2tT;mDDDr   N)r   r	   r
   strrT   r   rl   r/   boolclassmethodr   r{   r   r   r   r   r   r      s         
III
KKK
    _ _ [_ 
E$s) 
E 
E 
E [
E 
E 
Er   r   c                   R    e Zd ZU dZeed<   eed<   eed<   ee	e
f         ed<   d ZdS )Elf32zELF binary file
elf_headerprogram_header_tablesection_header_tablesectionsc                    t          t          | j                            }t                      }t                      }| j        j        D ]$}|                    t          |                     %| j        j        D ]4}|                    t          || j        j        j	                             5d|fg}| j        j
        r#|r!|                    | j        j
        |f           | j        j        r#|r!|                    | j        j        |f           | j                                        D ])\  }}|                    |t          |          f           *d}	|D ]\  }
}|
t          |          z   }||	k    r|}	 t          |	          }|D ]-\  }
}|d|
         |z   ||
t          |          z   d         z   }.t          |          S )z/Converts entire ELF to machine-ready executabler   N)	bytearrayr   r   r   rz   extendr   r   rW   rG   r[   appendr\   r   itemsr   )rR   elf_header_binprogram_header_table_binsection_header_table_binprogram_headersection_headerfile_elementsrp   r   rs   offsetrequired_sizerk   s                r   rS   zElf32.__bytes__  s   "5#9#9::#,;; #,;; "7? 	C 	CN$++E.,A,ABBBB"7? 	 	N$++,CNTXTcTrT|,},}~~~~78.6I5J?0 	d5M 	d  $/"GIa!bccc?0 	d5M 	d  $/"GIa!bccc!%!4!4!6!6 	A 	AK  +y!?@@@@	) 	* 	*LFD"SYY.My(()	9%%) 	H 	HLFDGVG_t+fVCII5E5F5F.GGFFV}}r   N)r   r	   r
   r   rV   rT   ry   r   dictrl   r   rS   r   r   r   r   r   	  sd         111111113:         r   r   c                   *    e Zd ZdZdZdZdZdZdZdZ	dS )	
SymbolTyper   r   r   r   r1         N)
r   r	   r
   NONEDATA_OBJECTFUNCTIONSECTIONFILENAMECOMMONTHREAD_LOCAL_STORAGEr   r   r   r   r   5  s4        DKHGHFr   r   c                       e Zd ZdZdZdZdS )SymbolBindingr   r   r   N)r   r	   r
   LOCALGLOBALWEAKr   r   r   r   r   >  s        EFDDDr   r   c                   V    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   dS )	Elf32SymbolTableEntryr   rM   sizer   bindingothersection_indexN)r   r	   r
   rl   rT   r   r   r   r   r   r   r   C  sZ         OOOJJJ
III
JJJr   r   entryc           	      .   |t           j        k    rCt          j        d| j        | j        | j        dz  z   | j        | j        | j	        | j
                  S t          j        d| j        | j	        | j
        | j        | j        dz  z   | j        | j                  S )NIBBHLLr1   IIIBBH)r   r   rh   ri   r   r   r   r   r   rM   r   )r   rG   s     r   symbol_table_entry_to_bytesr   M  s    H$$${8U%5
u}XYGY7Z\a\gini|  D  J  LQ  LV  W  W  	W{8U%5u{EJQVQ[`e`mqr`rPsuz  vA  CH  CV  W  W  	Wr   c                   ,    e Zd ZU ee         ed<   d ZdS )SymbolTablerz   c                 ~    d}t          | j                  D ]"\  }}|j        t          j        k    r||k    r|}#|dz   S )Nr   r   )	enumeraterz   r   r   r   )rR   &largest_symbol_index_with_local_symbolindexsymbols       r   )get_symbol_index_of_first_nonlocal_symbolz5SymbolTable.get_symbol_index_of_first_nonlocal_symbolX  sR    12.&t|44 	? 	?ME6~!444Ag9g9g9>6599r   N)r   r	   r
   r{   r   rT   r   r   r   r   r   r   T  s7         '((((: : : : :r   r   symbolsc                 P    d                     fd| j        D                       S )Nr   c                 0    g | ]}t          |          S r   )r   ).0r   rG   s     r   
<listcomp>z)symbol_table_to_bytes.<locals>.<listcomp>b  s$    bbb0CCbbbr   joinrz   )r   rG   s    `r   symbol_table_to_bytesr   a  s.    88bbbbRYRabbbcccr   c                   :    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )X86RelocationTyper   r   r   r   r1   r   r   rJ      	   
   N)r   r	   r
   r   	SIMPLE_32PC_RELATIVE_32GLOBAL_OFFSET_TABLE_INDEX_32(PROCEDURE_LOOKUP_TABLE_ENTRY_RELATIVE_32COPYSYMBOL_VALUE_NO_ADDEND_32JUMP_SLOT_32R_386_RELATIVELOAD_ADDRESS_RELATIVE_32R_386_GOTPCr   r   r   r   r   e  sI        DIN#$ /0,D !LN KKKr   r   c                   8    e Zd ZU eed<   eed<   eed<   eed<   dS )RelocationTableEntryWithAddendr   r   symbol_indexaddendN)r   r	   r
   rl   rT   r   r   r   r   r   r   r  s:         KKK
KKKKKr   r   c                     |t           j        k    rd}d}nd}d}t          j        || j        | j        |z  | j        z   | j                  S )NLLlr<   IIir   )r   r   rh   ri   r   r   r   r   )r   rG   rj   symbol_index_bit_offsets       r   relocation_table_entry_to_bytesr   y  sW    H$$$"$"#;vu|e.@D[.[_d_i-ikpkwxxxr   stringsc                 `    dt          g                               d | D                       z   S )N    c                 >    g | ]}|                     d           dz   S )r   r   )r   )r   strings     r   r   z5make_null_terminated_string_table.<locals>.<listcomp>  s)    "X"X"Xf6==#9#9E#A"X"X"Xr   )r   r   )r   s    r   !make_null_terminated_string_tabler     s/    599>>"X"XPW"X"X"XYYYYr   c                   &    e Zd ZU ee         ed<   dS )RelocationTablerz   N)r   r	   r
   r{   r   rT   r   r   r   r  r    s$         0111111r   r  tablec                 P    d                     fd| j        D                       S )Nr   c                 0    g | ]}t          |          S r   )r   )r   
relocationrG   s     r   r   z-relocation_table_to_bytes.<locals>.<listcomp>  s%    lllPZ4ZKKlllr   r   )r  rG   s    `r   relocation_table_to_bytesr    s.    88llll^c^klllmmmr   )Cr   rh   enumdataclassesr   Enumr   r   r   r   r"   r(   r-   r/   r7   E_IDENT_SIZEELF32_HEADER_SIZEELF64_HEADER_SIZEELF32_PROGRAM_HEADER_SIZEELF32_SECTION_HEADER_SIZEELF64_SECTION_HEADER_SIZE
ELFCLASS32ELFDATA2LSB
EV_CURRENTELF_OSABI_SYSVET_EXECEM_ARMPT_LOADPF_RPF_WPF_XSHT_NULLSHT_PROGBITS
SHT_STRTAB	SHF_ALLOCSHF_EXECINSTRELF32_SYMBOL_TABLE_ENTRY_SIZEELF64_SYMBOL_TABLE_ENTRY_SIZE!ELF32_RELOCATION_TABLE_ENTRY_SIZE!ELF64_RELOCATION_TABLE_ENTRY_SIZEStrEnumrA   rF   rV   rn   ry   r~   r   r   r   r   r   IntEnumr   r   r   r   r   r   r   r   r   r{   r   r   r  r  r   r   r   <module>r&     s  & &   ! ! ! ! ! !    ty   
    	   
" " " " " " " "    DI   
" " " " "ty " " "    	          & & & & &TY & & &# # # # #TY # # #
      


	

	 "  " $& !$& !" " " " " " " " S S S S S S S S ) ) ) ) ) ) ) )V y y y y y y y y & & & & & & & & )
 )
 )
 )
 )
 )
 )
 )
V$6 8 PU    ( & & & & & & & & E E E E E E E E0 ) ) ) ) ) ) ) )V           DL   
        W'< W W W W W 
: 
: 
: 
: 
: 
: 
: 
:d; d8 d d d d               y+I yV^ y y y yZtCy ZU Z Z Z Z 2 2 2 2 2 2 2 2n_ n n n n n n nr   