U
    ¸mœdÂ  ã                   @   sˆ   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„ 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 )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                   @   s   e Zd ZdS )Ú
ELFInvalidN)Ú__name__Ú
__module__Ú__qualname__© r	   r	   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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                   @   sR   e Zd ZdZee ddœdd„Zeee	df dœdd	„Z
eee d
œdd„ƒZdS )ÚELFFilez.
    Representation of an ELF executable.
    N)ÚfÚreturnc              
   C   s(  || _ z|  d¡}W n tjk
r2   tdƒ‚Y nX t|d d… ƒ}|dkrZtd|›�ƒ‚|d | _|d | _z(ddd	d
dœ| j| jf \}| _| _	W n. t
k
rÄ   td| j› d| j› d�ƒ‚Y nX z,|  |¡\
}| _}}| _}| _}| _| _W n0 tjk
�r" } ztdƒ|‚W 5 d }~X Y nX d S )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Ú_Úer	   r	   r
   Ú__init__,   sL    

ü
ûÿ
õözELFFile.__init__.)Úfmtr   c                 C   s   t  || j t  |¡¡¡S )N)r    Úunpackr   ÚreadÚcalcsize)r-   r4   r	   r	   r
   r   Z   s    zELFFile._read)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Úfsdecoder6   Ústrip)r-   ÚindexÚdatar	   r	   r
   Úinterpreter]   s    
&zELFFile.interpreter)r   r   r   Ú__doc__r   r"   r3   Ústrr   Úintr   Úpropertyr   r@   r	   r	   r	   r
   r   '   s
   .r   )rA   Úenumr;   r    Útypingr   r   r   Ú
ValueErrorr   ÚIntEnumr   r   r   r   r	   r	   r	   r
   Ú<module>   s   
