
    d                          d dl mZ ddlmZ ddlmZ ddlmZ  G d de      Z	 G d d	e      Z
 G d
 de
      Z G d de
      Z G d de
      Zd Zy)   )struct_parse   )EHABIBytecodeDecoder)EHABI_INDEX_ENTRY_SIZE)EHABIStructsc                   .    e Zd ZdZd Zd Zd Zd Zd Zy)	EHABIInfoa   ARM exception handler abi information class.

        Parameters:

            arm_idx_section:
                elf.sections.Section object, section which type is SHT_ARM_EXIDX.

            little_endian:
                bool, endianness of elf file.
    c                 @    || _         t        |      | _        d | _        y N)_arm_idx_sectionr   _struct
_num_entry)selfarm_idx_sectionlittle_endians      :/usr/lib/python3/dist-packages/elftools/ehabi/ehabiinfo.py__init__zEHABIInfo.__init__   s     /#M2    c                 .    | j                   j                  S r   )r   namer   s    r   section_namezEHABIInfo.section_name"   s    $$)))r   c                      | j                   d   S )N	sh_offset)r   r   s    r   section_offsetzEHABIInfo.section_offset%   s    $$[11r   c                 h    | j                   | j                  d   t        z  | _         | j                   S )z; Number of exception handler entry in the section.
        sh_size)r   r   r   r   s    r   	num_entryzEHABIInfo.num_entry(   s0     ??""33I>BXXDOr   c                    || j                         k\  rt        d|| j                  fz        | j                         |t        z  z   }t        | j                  j                  | j                  j                  |      }|d   |d   }}|dz  dk7  rt        d|z        S t        || j                         |t        z  z         }|dk(  rt        |      S |dz  dk(  rt        || j                         |t        z  z   dz         }t        | j                  j                  | j                  j                  |      }|d   }|dz  dk(  rt        |t        ||            S |d	z  dk7  rt        d
|z        S |dz	  dz  }|dk(  r!|dz  dz	  |dz  dz	  |dz  g}	t        |||	      S |dk(  s|dk(  r|dz	  dz  }
|dz	  dz  |dz	  dz  g}	| j                  j                  j!                  |dz          t#        |
      D ]  }t        | j                  j                  | j                  j                        d   }|	j%                  |dz	  dz         |	j%                  |dz	  dz         |	j%                  |dz	  dz         |	j%                  |dz	  dz          t        |||	|      S t        d||fz        S |dz  dk7  rt        d
|z        S |dz  dz	  |dz  dz	  |dz  g}	t        |d|	      S )zX Get the exception handler entry at index #n. (EHABIEntry object or a subclass)
        zInvalid entry %d/%dword0word1l            z-Corrupt ARM exception handler table entry: %xr      i   pz)Corrupt ARM compact model table entry: %x      i      i         r   )eh_table_offsetz/Unknown ARM compact model %d at table entry: %xi   )r   
IndexErrorr   r   r   r   r   EH_index_structr   streamCorruptEHABIEntryarm_expand_prel31CannotUnwindEHABIEntryEH_table_structGenericEHABIEntry
EHABIEntryseekrangeappend)r   neh_index_entry_offseteh_index_datar    r!   function_offsetr)   	per_indexopcode	more_wordirs                r   	get_entryzEHABIInfo.get_entry/   s!      2a5IIJJ $ 3 3 5<R8R R$T\\%A%A4CXCXC_C_avw$W-}W/Eu:"$%TWX%XYY+E43F3F3H1OeKe3efA:)/::Z1$/t7J7J7LqSiOi7ilm7mnO()E)EtG\G\GcGcetuM!'*Ez!Q&(:KESb:cdd :%*,-X[\-\]]"b[D0	>$x/B6A8MuW[|\F%oy&II!^yA~!&" 4I$zT1EQJ$3FGF))0055o6IJ"9- 7()E)EtG\G\GcGcdelmqBw$&67qBw$&67qAvo6qAvo67 &oy&Zijj,-^bkmnao-opp z!Q&()TWX)XYYx'B.A0Eut|TFoq&99r   N)	__name__
__module____qualname____doc__r   r   r   r   r?    r   r   r	   r	      s     	
*26:r   r	   c                   *    e Zd ZdZ	 	 	 ddZd Zd Zy)r2   a   Exception handler abi entry.

        Accessible attributes:

            function_offset:
                Integer.
                None if corrupt. (Reference: CorruptEHABIEntry)

            personality:
                Integer.
                None if corrupt or unwindable. (Reference: CorruptEHABIEntry, CannotUnwindEHABIEntry)
                0/1/2 for ARM personality compact format.
                Others for generic personality.

            bytecode_array:
                Integer array.
                None if corrupt or unwindable or generic personality.
                (Reference: CorruptEHABIEntry, CannotUnwindEHABIEntry, GenericEHABIEntry)

            eh_table_offset:
                Integer.
                Only entries who point to .ARM.extab contains this field, otherwise return None.

            unwindable:
                bool. Whether this function is unwindable.

            corrupt:
                bool. Whether this entry is corrupt.

    Nc                 X    || _         || _        || _        || _        || _        || _        y r   )r9   personalitybytecode_arrayr)   
unwindablecorrupt)r   r9   rG   rH   r)   rI   rJ   s          r   r   zEHABIEntry.__init__   s2      /&,.$r   c                 Z    | j                   rt        | j                         j                  S y r   )rH   r   mnemonic_arrayr   s    r   mnmemonic_arrayzEHABIEntry.mnmemonic_array   s%    '(;(;<KKKr   c                     d| j                   | j                  | j                  rd| j                  z  nd| j                  fz  S )Nz@<EHABIEntry function_offset=0x%x, personality=%d, %sbytecode=%s>zeh_table_offset=0x%x,  )r9   rG   r)   rH   r   s    r   __repr__zEHABIEntry.__repr__   sJ    Q  ?C?S?S$t';';;Y[	U! ! 	!r   )NTF)r@   rA   rB   rC   r   rM   rP   rD   r   r   r2   r2   h   s"    F "& !r   r2   c                   (     e Zd ZdZ fdZd Z xZS )r-   z= This entry is corrupt. Attribute #corrupt will be True.
    c                 B    t         t        |   d d d d       || _        y )NT)r9   rG   rH   rJ   )superr-   r   reason)r   rT   	__class__s     r   r   zCorruptEHABIEntry.__init__   s*    /RVgk8< 	0 	>r   c                      d| j                   z  S )Nz<CorruptEHABIEntry reason=%s>)rT   r   s    r   rP   zCorruptEHABIEntry.__repr__   s    .<<r   r@   rA   rB   rC   r   rP   __classcell__rU   s   @r   r-   r-      s    
=r   r-   c                   (     e Zd ZdZ fdZd Z xZS )r/   zJ This function cannot be unwind. Attribute #unwindable will be False.
    c                 4    t         t        |   |d d d       y )NF)rG   rH   rI   )rS   r/   r   )r   r9   rU   s     r   r   zCannotUnwindEHABIEntry.__init__   s$    $d4_RVgk@E 	5 	Gr   c                      d| j                   z  S )Nz-<CannotUnwindEHABIEntry function_offset=0x%x>)r9   r   s    r   rP   zCannotUnwindEHABIEntry.__repr__   s    >AUAUUUr   rW   rY   s   @r   r/   r/      s    GVr   r/   c                   (     e Zd ZdZ fdZd Z xZS )r1   zg This entry is generic model rather than ARM compact model.Attribute #bytecode_array will be None.
    c                 2    t         t        |   ||d        y )N)rH   )rS   r1   r   )r   r9   rG   rU   s      r   r   zGenericEHABIEntry.__init__   s    /]a/br   c                 8    d| j                   | j                  fz  S )Nz:<GenericEHABIEntry function_offset=0x%x, personality=0x%x>)r9   rG   r   s    r   rP   zGenericEHABIEntry.__repr__   s    KtOcOceieueuNvvvr   rW   rY   s   @r   r1   r1      s    cwr   r1   c                 0    | dz  }|dz  r|dz  }||z   dz  S )zG
       address: uint32
       place: uint32
       return: uint64
    ii   l        l    rD   )addressplacelocations      r   r.   r.      s2     #H*&&e000r   N)common.utilsr   decoderr   	constantsr   structsr   objectr	   r2   r-   r/   r1   r.   rD   r   r   <module>ri      s\    ( ) - !T: T:n9! 9!x
=
 
=	VZ 	Vw
 w	1r   