
    R"f                         d Z ddlZddlZddlZddlmZmZmZ  G d de      Z	 G d dej                        Z G d d	ej                        Z G d
 dej                        Z G d d      Zy)a;  
ELF file parser.

This provides a class ``ELFFile`` that parses an ELF executable in a similar
interface to ``ZipFile``. Only the read interface is implemented.

Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
    N)IOOptionalTuplec                       e Zd Zy)
ELFInvalidN)__name__
__module____qualname__     4/usr/lib/python3/dist-packages/packaging/_elffile.pyr   r      s    r   r   c                       e Zd ZdZdZy)EIClass      N)r   r	   r
   C32C64r   r   r   r   r          
C
Cr   r   c                       e Zd ZdZdZy)EIDatar   r   N)r   r	   r
   LsbMsbr   r   r   r   r      r   r   r   c                        e Zd ZdZdZdZdZdZy)EMachine      (   >      N)r   r	   r
   I386S390ArmX8664AArc64r   r   r   r   r      s    DD
CEFr   r   c                   \    e Zd ZdZdee   ddfdZdedee	df   fdZ
edee   fd	       Zy)
ELFFilez.
    Representation of an ELF executable.
    freturnNc           
      b   || _         	 | j                  d      }t        |d d       }|dk7  rt	        d|      |d   | _        |d   | _        	 ddd	d
d| j                  | j                  f   \  }| _        | _	        	 | j                  |      \
  }| _        }}| _        }| _        }| _        | _        y # t        j                  $ r t	        d      w xY w# t        $ r' t	        d| j                   d| j                   d      w xY w# t        j                  $ r}t	        d      |d }~ww xY w)N16Bzunable to parse identification   s   ELFzinvalid magic:    )z<HHIIIIIHHHz	<IIIIIIIIr   r   r+   )z>HHIIIIIHHHz	>IIIIIIIIr-   )z<HHIQQQIHHHz	<IIQQQQQQr   r   r,   )z>HHIQQQIHHHz	>IIQQQQQQr.   ))r   r   )r   r   )r   r   )r   r   zunrecognized capacity (z) or encoding ()z/unable to parse machine and section information)_f_readstructerrorr   bytescapacityencoding_p_fmt_p_idxKeyErrormachine_e_phoffflags_e_phentsize_e_phnum)selfr'   identmagice_fmt_es          r   __init__zELFFile.__init__,   sb   	?JJu%E eBQi Jui899aa	
 @???	/
 }}dmm,/.+E4;	W 

5!
!I || 	?=>>	?&  	)$-- 9!]]O1. 	& || 	WNOUVV	Ws/   B5 .C ?5D
 5C0D
D.D))D.fmt.c                     t        j                  || j                  j                  t        j                  |                  S )N)r2   unpackr0   readcalcsize)r?   rF   s     r   r1   zELFFile._readZ   s)    }}S$'',,vs/C"DEEr   c                 *   t        | j                        D ]  }| j                  j                  | j                  | j
                  |z  z          	 | j                  | j                        }|| j                  d      dk7  rj| j                  j                  || j                  d             t        j                  | j                  j                  || j                  d                  j                  d      c S  y# t        j                  $ r Y w xY w)zH
        The path recorded in the ``PT_INTERP`` section header.
        r   r   r   r    N)ranger>   r0   seekr;   r=   r1   r7   r2   r3   r8   osfsdecoderI   strip)r?   indexdatas      r   interpreterzELFFile.interpreter]   s    
 4==) 		OEGGLL):):U)BBCzz$++. DKKN#q(GGLLdkk!n-.;;tww||DQ,@ABHHNN		O  << s   C<<DD)r   r	   r
   __doc__r   r4   rE   strr   intr1   propertyr   rT   r   r   r   r&   r&   '   s_    ,W"U) ,W ,W\F FsCx F Xc]  r   r&   )rU   enumrO   r2   typingr   r   r   
ValueErrorr   IntEnumr   r   r   r&   r   r   r   <module>r]      sc     	  & &	 	dll 
T\\ 
t|| E Er   