U
    +5øi‹  ã                   @  sŒ   d Z ddlmZ ddlZddlZddlZddlmZ G dd„ deƒZ	G dd„ dej
ƒZG d	d
„ d
ej
ƒZG dd„ dej
ƒZG dd„ dƒZdS )zð
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.

ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
é    )ÚannotationsN)ÚIOc                   @  s   e Zd ZdS )Ú
ELFInvalidN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú6/tmp/pip-unpacked-wheel-xj899fla/packaging/_elffile.pyr      s   r   c                   @  s   e Zd ZdZdZdS )ÚEIClassé   é   N)r   r   r   ZC32ZC64r   r   r   r	   r
      s   r
   c                   @  s   e Zd ZdZdZdS )ÚEIDatar   r   N)r   r   r   ZLsbZMsbr   r   r   r	   r      s   r   c                   @  s    e Zd ZdZdZdZdZdZdS )ÚEMachineé   é   é(   é>   é·   N)r   r   r   ZI386ZS390ZArmZX8664ZAArc64r   r   r   r	   r       s
   r   c                   @  sB   e Zd ZdZdddœdd„Zddd	œd
d„Zeddœdd„ƒZdS )ÚELFFilez.
    Representation of an ELF executable.
    z	IO[bytes]ÚNone)ÚfÚreturnc              
   C  sH  || _ z|  d¡}W n. tjk
rB } ztdƒ|‚W 5 d }~X Y nX t|d d… ƒ}|dkrjtd|›�ƒ‚|d | _|d | _z(ddd	d
dœ| j| jf \}| _| _	W n> t
k
rä } z td| j› d| j› d�ƒ|‚W 5 d }~X Y nX z,|  |¡\
}| _}}| _}| _}| _| _W n0 tjk
�rB } ztdƒ|‚W 5 d }~X Y nX d S )NZ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ÚeÚmagicZe_fmtÚ_r   r   r	   Ú__init__-   sP    

ü
ûÿþõözELFFile.__init__Ústrztuple[int, ...])Úfmtr   c                 C  s   t  || j t  |¡¡¡S )N)r   Úunpackr   ÚreadÚcalcsize)r,   r3   r   r   r	   r   Z   s    zELFFile._readz
str | None)r   c              	   C  s¦   t | jƒD ]–}| j | j| j|  ¡ z|  | j¡}W n tj	k
rP   Y q
Y nX || j
d  dkrfq
| j || j
d  ¡ t | j || j
d  ¡¡ d¡  S dS )zH
        The path recorded in the ``PT_INTERP`` section header.
        r   r   r   r   ú N)Úranger+   r   Úseekr(   r*   r   r$   r   r    r%   ÚosÚfsdecoder5   Ústrip)r,   ÚindexÚdatar   r   r	   Úinterpreter]   s    
&zELFFile.interpreterN)r   r   r   Ú__doc__r1   r   Úpropertyr?   r   r   r   r	   r   (   s
   -r   )r@   Ú
__future__r   Úenumr:   r   Útypingr   Ú
ValueErrorr   ÚIntEnumr
   r   r   r   r   r   r   r	   Ú<module>   s   	