o
    s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   f/var/www/html/construction_image-detection-poc/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    
