
    dY                         d dl mZmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ ddl  G d de      Zy)	   )UBInt8UBInt16UBInt32UBInt64ULInt8ULInt16ULInt32ULInt64SBInt32SLInt32SBInt64SLInt64StructArrayEnumPadding	BitStructBitFieldValueStringCStringSwitchField)ULEB128)roundup   )*c                       e Zd ZdZddZd Zd Zd Zd 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!dZd Zd Zd Zd Zd Zd Zy)"
ELFStructsa   Accessible attributes:

            Elf_{byte|half|word|word64|addr|offset|sword|xword|xsword}:
                Data chunks, as specified by the ELF standard, adjusted for
                correct endianness and word-size.

            Elf_Ehdr:
                ELF file header

            Elf_Phdr:
                Program header

            Elf_Shdr:
                Section header

            Elf_Sym:
                Symbol table entry

            Elf_Rel, Elf_Rela:
                Entries in relocation sections
    c                 b    |dk(  s|dk(  sJ || _         || _        d | _        d | _        d | _        y )N    @   little_endianelfclasse_type	e_machinee_ident_osabi)selfr$   r%   s      6/usr/lib/python3/dist-packages/elftools/elf/structs.py__init__zELFStructs.__init__,   s:    2~R//* !    c                 t    | j                   | j                  | j                  | j                  | j                  fS Nr#   r)   s    r*   __getstate__zELFStructs.__getstate__4   s+    !!4==$++t~~tOaOaaar,   c                 n    |\  | _         | _        }}}| j                          | j                  |||       y r.   )r$   r%   create_basic_structscreate_advanced_structs)r)   stater&   r'   e_osabis        r*   __setstate__zELFStructs.__setstate__7   s5    HMEDM69g!!#$$VY@r,   c                    | j                   rt        | _        t        | _        t
        | _        t        | _        | j                  dk(  rt
        nt        | _
        | j                  | _        t        | _        | j                  dk(  rt
        nt        | _        | j                  dk(  rt        nt        | _        nt"        | _        t$        | _        t&        | _        t(        | _        | j                  dk(  rt&        nt(        | _
        | j                  | _        t*        | _        | j                  dk(  rt&        nt(        | _        | j                  dk(  rt*        nt,        | _        | j/                          | j1                          | j3                          y)zr Create word-size related structs and ehdr struct needed for
            initial determining of ELF type.
        r!   N)r$   r   Elf_byter   Elf_halfr	   Elf_wordr
   
Elf_word64r%   Elf_addr
Elf_offsetr   	Elf_sword	Elf_xwordr   
Elf_sxwordr   r   r   r   r   r   _create_ehdr_create_leb128_create_ntbsr/   s    r*   r2   zELFStructs.create_basic_structs<   s    "DM#DM#DM%DO'+}}':GDM"mmDO$DN(,(;WDN)-")<g'DO"DM#DM#DM%DO'+}}':GDM"mmDO$DN(,(;WDN)-")<g'DOr,   Nc                    || _         || _        || _        | j                          | j	                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                  |       | j!                          | j#                          | j%                          | j'                          | j)                          | j+                          y)z Create all ELF structs except the ehdr. They may possibly depend
            on provided e_type and/or e_machine parsed from ehdr.
        N)r&   r'   r(   _create_phdr_create_shdr_create_chdr_create_sym_create_rel_create_dyn_create_sunw_syminfo_create_gnu_verneed_create_gnu_verdef_create_gnu_versym_create_gnu_abi_create_gnu_property_create_note_create_stabs_create_attributes_subsection_create_arm_attributes_create_riscv_attributes_create_elf_hash_create_gnu_hash)r)   r&   r'   r(   s       r*   r3   z"ELFStructs.create_advanced_structsX   s     "*!!#  "!!!!#&!**,##%%%'r,   c                    t        dt        dt        d| j                  d            t        | j                  d      fi t        t        | j                  d      fi t
        t        | j                  d      fi t        t        | j                  d      fi t        | j                  d	      t        d
            t        | j                  d      fi t        t        | j                  d      fi t        t        | j                  d      fi t        | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d            | _        y )NElf_Ehdre_ident   EI_MAGEI_CLASSEI_DATA
EI_VERSIONEI_OSABIEI_ABIVERSION   r&   r'   	e_versione_entrye_phoffe_shoffe_flagse_ehsizee_phentsizee_phnume_shentsizee_shnum
e_shstrndx)r   r   r8   r   ENUM_EI_CLASSENUM_EI_DATAENUM_E_VERSIONENUM_EI_OSABIr   r9   ENUM_E_TYPEENUM_E_MACHINEr:   r<   r=   rY   r/   s    r*   rA   zELFStructs._create_ehdrv   sT   z9ax01T]]:.@-@T]]9->>T]]<0CNCT]]:.@-@o.
 x(8K8{+>~>{+>~>MM)$OOI&OOI&MM)$MM*%MM-(MM)$MM-(MM)$MM,'-
r,   c                     t         | _        y r.   )r   Elf_uleb128r/   s    r*   rB   zELFStructs._create_leb128   s
    "r,   c                     t         | _        y r.   )r   Elf_ntbsr/   s    r*   rC   zELFStructs._create_ntbs   s	    r,   c                 F   t         }| j                  dk(  rt        }nA| j                  dk(  rt        }n+| j                  dk(  rt        }n| j                  dk(  rt
        }| j                  dk(  rt        dt        | j                  d      fi || j                  d      | j                  d	      | j                  d
      | j                  d      | j                  d      | j                  d      | j                  d      	      | _        y t        dt        | j                  d      fi || j                  d      | j                  d      | j                  d	      | j                  d
      | j                  d      | j                  d      | j                  d      	      | _        y )NEM_ARM
EM_AARCH64EM_MIPSEM_RISCVr!   Elf_Phdrp_typep_offsetp_vaddrp_paddrp_fileszp_memszp_flagsp_align)ENUM_P_TYPE_BASEr'   ENUM_P_TYPE_ARMENUM_P_TYPE_AARCH64ENUM_P_TYPE_MIPSENUM_P_TYPE_RISCVr%   r   r   r:   r=   r<   r}   r?   )r)   p_type_dicts     r*   rE   zELFStructs._create_phdr   sI   &>>X%)K^^|+-K^^y(*K^^z)+K==B":T]]8,<<
+i(i(j)i(i(i(	DM #:T]]8,<<i(
+i(i(z*y)y)	DMr,   c                 0   t         }| j                  dk(  rt        }n+| j                  dk(  rt        }n| j                  dk(  rt        }| j                  dk(  rt
        }t        d| j                  d      t        | j                  d      fi || j                  d      | j                  d	      | j                  d
      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d            | _        y)zmSection header parsing.

        Depends on e_machine because of machine-specific values in sh_type.
        ry   	EM_X86_64r{   r|   Elf_Shdrsh_namesh_typesh_flagssh_addr	sh_offsetsh_sizesh_linksh_infosh_addralign
sh_entsizeN)ENUM_SH_TYPE_BASEr'   ENUM_SH_TYPE_ARMENUM_SH_TYPE_AMD64ENUM_SH_TYPE_MIPSENUM_SH_TYPE_RISCVr   r:   r   r?   r<   r=   r   )r)   sh_type_dicts     r*   rF   zELFStructs._create_shdr   s    
 )>>X%+L^^{*-L^^y(,L>>Z'-LzMM)$y):\:NN:&MM)$OOK(NN9%MM)$MM)$NN>*NN<(
r,   c                    t        | j                  d      fi t        | j                  d      | j                  d      g}| j                  dk(  r!|j                  d| j                  d             t        dg| | _        y )Nch_typech_sizech_addralignr"   r   ch_reservedElf_Chdr)r   r:   ENUM_ELFCOMPRESS_TYPEr?   r%   insertr   r   )r)   fieldss     r*   rG   zELFStructs._create_chdr   sp     y)C-BCNN9%NN>*

 ==BMM!T]]=9:z3F3r,   c                    | j                   dk(  r+| j                  d      t        dd       t        dd       g}n| j                  dk(  r| j	                  d      | j                  d	      | j                  d
      | j                  d      | j                  d      t        dd       t        dd       t        dd       t        dd       t        dd       t        dd       g}n*| j                  d      t        dd       t        dd       g}t        d| j                  d      g| | _        || j                  d      gz   }t        d| j                  d      g| | _
        t        d| j                  d            | _        y )Nr!   r_info
r_info_symc                     | d   dz	  dz  S )Nr      i  ctxs    r*   <lambda>z(ELFStructs._create_rel.<locals>.<lambda>   s    X!);x(G r,   r_info_typec                     | d   dz  S )Nr      r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   s    H(< r,   r{   r_symr_ssymr_type3r_type2r_typec                     | d   S )Nr   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   s
    G r,   r_info_ssymc                     | d   S )Nr   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   
    X r,   c                     | d   S )Nr   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   r   r,   r_info_type2c                     | d   S )Nr   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   
    #i. r,   r_info_type3c                     | d   S )Nr   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   r   r,   c                 T    | d   dz  | d   dz  z  | d   dz  z  | d   dz  z  | d	   z  S )
Nr   r!   r      r      r   r   r   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>   sR    3w<2#5%(]b%8#:%(^r%9#; &)^q%8#: %(M	#2 r,   c                     | d   dz	  dz  S )Nr   r!       r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>	  s    X")<
(J r,   c                     | d   dz  S )Nr   r   r   r   s    r*   r   z(ELFStructs._create_rel.<locals>.<lambda>  s    H
(B r,   Elf_Relr_offsetr_addendElf_RelaElf_Relr)r%   r?   r   r'   r:   r8   r   r<   r   r@   r   r   )r)   r   fields_and_addends      r*   rI   zELFStructs._create_rel   s    ==BnnX.LGIM<>?F
 ^^y(
 g&h'i(i(h' l$<=m%>?m%>?n&@An&@Ah23'F6 nnX.LJLMBDEF i"mmJ7'%' #dooj&A%BBz#}}Z8
 1
 z4==+DEr,   c           	      `   t        t              }| j                  t        v r#|j	                  t        | j                            n$| j
                  dk(  r|j	                  t               t        dt        | j                  d      fi || j                  d      t        dd             | _        y )NELFOSABI_SOLARISElf_Dynd_tagd_vald_ptrc                     | d   S )Nr   r   r   s    r*   r   z(ELFStructs._create_dyn.<locals>.<lambda>'  s
    s7| r,   )dictENUM_D_TAG_COMMONr'   ENUMMAP_EXTRA_D_TAG_MACHINEupdater(   ENUM_D_TAG_SOLARISr   r   r@   r?   r   r   )r)   
d_tag_dicts     r*   rJ   zELFStructs._create_dyn  s    +,
>>889$..IJ#5501i)8Z8NN7#'34
r,   c                    t        dt        t        dd      fi t        t        t        dd      fi t              }t        dt        t        dd      fi t
        t        d      t        t        d	d      fi t              }| j                  d
k(  rat        d| j                  d      | j                  d      | j                  d      ||t        | j                  d      fi t              | _        y t        d| j                  d      ||t        | j                  d      fi t        | j                  d      | j                  d            | _        y )Nst_infobindr[   typest_otherlocal   r   
visibilityr!   Elf_Symst_namest_valuest_sizest_shndx)r   r   r   ENUM_ST_INFO_BINDENUM_ST_INFO_TYPEENUM_ST_LOCALr   ENUM_ST_VISIBILITYr%   r   r:   r<   r9   ENUM_ST_SHNDXr   r?   )r)   st_info_structst_other_structs      r*   rH   zELFStructs._create_sym*  s'    #9&!$:(9:&!$:(9:<
 $J '1%77AJ,*A.@AC ==B!)i(j)i(T]]:.@-@DL ")i(T]]:.@-@j)y)DLr,   c                     t        dt        | j                  d      fi t        | j                  d            | _        y )NElf_Sunw_Syminfo
si_boundtosi_flags)r   r   r9   ENUM_SUNW_SYMINFO_BOUNDTOr   r/   s    r*   rK   zELFStructs._create_sunw_syminfoK  s5     &'9|,J0IJMM*%!
r,   c           
         t        d| j                  d      | j                  d      | j                  d      | j                  d      | j                  d            | _        t        d| j                  d      | j                  d	      | j                  d
      | j                  d      | j                  d            | _        y )NElf_Verneed
vn_versionvn_cntvn_filevn_auxvn_nextElf_Vernauxvna_hash	vna_flags	vna_othervna_namevna_next)r   r9   r:   r   r   r/   s    r*   rL   zELFStructs._create_gnu_verneedQ  s     "-MM,'MM(#MM)$MM(#MM)$
 "-MM*%MM+&MM+&MM*%MM*%
r,   c                 d   t        d| j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d      | j                  d            | _        t        d	| j                  d
      | j                  d            | _        y )N
Elf_Verdef
vd_versionvd_flagsvd_ndxvd_cntvd_hashvd_auxvd_nextElf_Verdauxvda_namevda_next)r   r9   r:   r  r  r/   s    r*   rM   zELFStructs._create_gnu_verdefc  s     !MM,'MM*%MM(#MM(#MM)$MM(#MM)$
 "-MM*%MM*%
r,   c                 `    t        dt        | j                  d      fi t              | _        y )N
Elf_Versymndx)r   r   r9   ENUM_VERSYMr  r/   s    r*   rN   zELFStructs._create_gnu_versymt  s(     !u%55
r,   c           	          t        dt        | j                  d      fi t        | j                  d      | j                  d      | j                  d            | _        y )NElf_abiabi_os	abi_major	abi_minorabi_tiny)r   r   r:   ENUM_NOTE_ABI_TAG_OSr  r/   s    r*   rO   zELFStructs._create_gnu_abi{  sM     ix(A,@AMM+&MM+&MM*%	
r,   c                 P    t        dt        d      t        dd            | _        y )NElf_debugaltlinksup_filenamesup_checksum   )length)r   r   r   r  r/   s    r*   _create_gnu_debugaltlinkz#ELFStructs._create_gnu_debugaltlink  s$     &'9N#>"-!/r,   c                 >     fd} fd}t        dt         j                  d      fi t         j                  d      t	        d| j                  d       j                  d       j                  d      dt        dd       	      t        |             _        y )
Nc                     j                   dk(  r#t        | j                  d      | j                  z
  S t        | j                  d      | j                  z
  S )Nr!   r   r   )r%   r   	pr_dataszr   r)   s    r*   roundup_paddingz8ELFStructs._create_gnu_property.<locals>.roundup_padding  sC    }}"s}}a03==@@3==!,s}}<<r,   c                     t        | j                        t        ury | j                  j                  d      ry| j                  | j                  j
                  fS )NGNU_PROPERTY_X86_zGNU_PROPERTY_X86_*r[       )r   pr_typestr
startswithr"  r%   r#  s    r*   classify_pr_dataz9ELFStructs._create_gnu_property.<locals>.classify_pr_data  sF    CKK +{{%%&9:3KK>>r,   Elf_Propr)  r"  pr_data))GNU_PROPERTY_STACK_SIZEr[   r!   )r/  r   r"   r'  c                     | j                   S r.   )r"  r   s    r*   r   z1ELFStructs._create_gnu_property.<locals>.<lambda>  s
    S]] r,   )default)	r   r   r:   ENUM_NOTE_GNU_PROPERTY_TYPEr   r;   r   r   r-  )r)   r$  r,  s   `  r*   rP   zELFStructs._create_gnu_property  s    	=
	? zy)I-HIMM+&9.8<i8P8<	8R26--	2J1
 i)BC O$
r,   c                    | j                   dk(  r| j                  dv r| j                  n| j                  | _        t        d| j                  d      | j                  d      t        | j                  d      fi |dk7  rt        nt              | _	        | j                   dk(  rt        d| j                  d	      t        d
d      | j                  d      | j                  d      | j                  d      | j	                  d      | j	                  d      | j                  d      | j                  d      | j                  d      | j                  d      t        dd      t        dd            | _        nt        d| j                  d	      t        d
d      | j                  d      | j                  d      t        d      | j                  d      | j	                  d      | j	                  d      | j                  d      | j                  d      | j                  d      | j                  d      t        dd      t        dd            | _        t        d| j                  d      | j                  d      t        d t        d| j!                  d      | j!                  d       | j#                  d!                  t        d" t%        d#                  | _        y )$Nr!   >
   EM_SHEM_386EM_68Kry   EM_CRISEM_M32REM_S390EM_SPARC
EM_MN10300EM_CYGNUS_FRVElf_Nhdrn_nameszn_descszn_typeET_COREElf_Prpsinfopr_statepr_snamer   pr_zombpr_nicepr_flagpr_uidpr_gidpr_pidpr_ppidpr_pgrppr_sidpr_fnamer   	pr_psargsP   r[   Elf_Nt_Filenum_map_entries	page_sizec                     | j                   S r.   rR  r   s    r*   r   z)ELFStructs._create_note.<locals>.<lambda>      C4G4G r,   Elf_Nt_File_Entryvm_startvm_endpage_offsetc                     | j                   S r.   rU  r   s    r*   r   z)ELFStructs._create_note.<locals>.<lambda>  rV  r,   filename)r%   r'   r9   r:   Elf_ugidr   r   ENUM_NOTE_N_TYPEENUM_CORE_NOTE_N_TYPEr=  r8   r   r?   rB  r   r   r<   r=   r   rQ  )r)   r&   s     r*   rQ   zELFStructs._create_note  sb    *.")< T
 B
 }} 	 zMM*%MM*%x( 1(.)(;$.1
 ==B &~j)z1%i(i(y)h'h'h'i(i(h'z2&{B'!D  !'~j)z1%i(i(
y)h'h'h'i(i(h'z2&{B'!D* "-"&..1B"C"&.."="'(G(./B-1]]:-F-1]]8-D-1__]-K)M#N
 #((G(/
(;#=	>r,   c           
          t        d| j                  d      | j                  d      | j                  d      | j                  d      | j                  d            | _        y )N	Elf_Stabsn_strxr@  n_othern_descn_value)r   r:   r8   r9   ra  r/   s    r*   rR   zELFStructs._create_stabs  sN      MM(#MM(#MM)$MM(#MM)$
r,   c                 h    t        d| j                  d      | j                  dd            | _        y )NElf_Attr_Subsectionr  vendor_namezutf-8)encoding)r   r:   rw   Elf_Attr_Subsection_Headerr/   s    r*   rS   z(ELFStructs._create_attributes_subsection  s7     +11F15x1H15}HO 2? 2Q+
'r,   c                 `    t        dt        | j                  d      fi t              | _        y )NElf_Arm_Attribute_Tagtag)r   r   ru   ENUM_ATTR_TAG_ARMrl  r/   s    r*   rT   z!ELFStructs._create_arm_attributes  s1    %+,C-1$2B2B52I .G4E.G&
"r,   c                 `    t        dt        | j                  d      fi t              | _        y )NElf_RiscV_Attribute_Tagrm  )r   r   ru   ENUM_ATTR_TAG_RISCVrp  r/   s    r*   rU   z#ELFStructs._create_riscv_attributes  s1    '-.G(,T-=-=e-D )D/B)D(
$r,   c                     t        d| j                  d      | j                  d      t        d | j                  d            t        d | j                  d                  | _        y )NElf_Hashnbucketsnchainsc                     | d   S Nrt  r   r   s    r*   r   z-ELFStructs._create_elf_hash.<locals>.<lambda>  
    Z r,   bucketsc                     | d   S )Nru  r   r   s    r*   r   z-ELFStructs._create_elf_hash.<locals>.<lambda>  s
    Y r,   chains)r   r:   r   rs  r/   s    r*   rV   zELFStructs._create_elf_hash  sT     z#}}Z8#}}Y7$%@$--PYBZ[$%?xAXY	[r,   c                    t        d| j                  d      | j                  d      | j                  d      | j                  d      t        d | j                  d            t        d | j                  d	                  | _        y )
NGnu_Hashrt  	symoffset
bloom_sizebloom_shiftc                     | d   S )Nr  r   r   s    r*   r   z-ELFStructs._create_gnu_hash.<locals>.<lambda>+  s    \1B r,   bloomc                     | d   S rw  r   r   s    r*   r   z-ELFStructs._create_gnu_hash.<locals>.<lambda>,  rx  r,   ry  )r   r:   r   r?   r}  r/   s    r*   rW   zELFStructs._create_gnu_hash!  sm    
 z#}}Z8#}}[9#}}\:#}}];$%BDNNSZD[\$%@$--PYBZ[]r,   )Tr!   )NNNr.   ) __name__
__module____qualname____doc__r+   r0   r6   r2   r3   rA   rB   rC   rE   rF   rG   rI   rJ   rH   rK   rL   rM   rN   rO   r  rP   rQ   rR   rS   rT   rU   rV   rW   r   r,   r*   r   r      s    *"bA
8 <
4#  D
849Fv
B

$
"

/

8I>V	



[]r,   r   N)	constructr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   common.construct_utilsr   common.utilsr   enumsobjectr   r   r,   r*   <module>r     sC          - " V] V]r,   