o
    üÞhÖ  ã                   @  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 )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
é    )ÚannotationsN)ÚIOc                   @  s   e Zd ZdS )Ú
ELFInvalidN)Ú__name__Ú
__module__Ú__qualname__© r   r   úR/var/www/html/premium_crap/venv/lib/python3.10/site-packages/packaging/_elffile.pyr      s    r   c                   @  ó   e Zd ZdZdZdS )ÚEIClassé   é   N)r   r   r   ÚC32ÚC64r   r   r   r	   r      ó    r   c                   @  r
   )ÚEIDatar   r   N)r   r   r   ÚLsbÚMsbr   r   r   r	   r      r   r   c                   @  s    e Zd ZdZdZdZdZdZdS )ÚEMachineé   é   é(   é>   é·   N)r   r   r   ÚI386ÚS390ÚArmÚX8664ÚAArc64r   r   r   r	   r   !   s    r   c                   @  s2   e Zd ZdZddd„Zddd„Zeddd„ƒZdS )ÚELFFilez.
    Representation of an ELF executable.
    Úfú	IO[bytes]ÚreturnÚNonec              
   C  s&  || _ z|  d¡}W n tjy } ztdƒ|‚d }~ww t|d d… ƒ}|dkr0td|›�ƒ‚|d | _|d | _zddd	d
dœ| j| jf \}| _| _	W n t
yh } ztd| j› d| j› d�ƒ|‚d }~ww z|  |¡\
}| _}}| _}| _}| _| _W d S  tjy’ } ztdƒ|‚d }~w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ÚeÚmagicÚe_fmtÚ_r   r   r	   Ú__init__.   sZ   
€ÿ

ü
ûÿþ€ÿõ

€ÿzELFFile.__init__ÚfmtÚstrútuple[int, ...]c                 C  s   t  || j t  |¡¡¡S )N)r,   Úunpackr*   ÚreadÚcalcsize)r9   r@   r   r   r	   r+   [   s   zELFFile._readú
str | Nonec              	   C  s    t | jƒD ]H}| j | j| j|  ¡ z|  | j¡}W n
 tj	y%   Y qw || j
d  dkr0q| 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)Úranger8   r*   Úseekr5   r7   r+   r1   r,   r-   r2   ÚosÚfsdecoderD   Ústrip)r9   ÚindexÚdatar   r   r	   Úinterpreter^   s   ÿ&zELFFile.interpreterN)r    r!   r"   r#   )r@   rA   r"   rB   )r"   rF   )r   r   r   Ú__doc__r?   r+   ÚpropertyrO   r   r   r   r	   r   )   s    

-r   )rP   Ú
__future__r   ÚenumrJ   r,   Útypingr   Ú
ValueErrorr   ÚIntEnumr   r   r   r   r   r   r   r	   Ú<module>   s    
