o
    өZh                     @   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	   I/var/www/html/lang_env/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   ZC32ZC64r	   r	   r	   r
   r          r   c                   @   r   )EIDatar   r   N)r   r   r   ZLsbZ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   ZI386ZS390ZArmZX8664ZAArc64r	   r	   r	   r
   r      s    r   c                   @   sV   e Zd ZdZdee ddfddZdedee	df fd	d
Z
edee fddZdS )ELFFilez.
    Representation of an ELF executable.
    freturnNc              
   C   s  || _ z| d}W n tjy   tdw t|d d }|dkr*td||d | _|d | _zddd	d
d| j| jf \}| _| _	W n t
y\   td| j d| j d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magice_fmt_er	   r	   r
   __init__,   sV   





zELFFile.__init__fmt.c                 C   s   t || jt |S )N)r"   unpackr    readcalcsize)r/   r6   r	   r	   r
   r!   Z   s   zELFFile._readc              	   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)ranger.   r    seekr+   r-   r!   r'   r"   r#   r(   osfsdecoder8   strip)r/   indexdatar	   r	   r
   interpreter]   s   &zELFFile.interpreter)r   r   r   __doc__r   r$   r5   strr   intr!   propertyr   rB   r	   r	   r	   r
   r   '   s    .r   )rC   enumr=   r"   typingr   r   r   
ValueErrorr   IntEnumr   r   r   r   r	   r	   r	   r
   <module>   s    
