B
    eJd                 @   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	   D/var/www/html/venv/lib/python3.7/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(  || _ y| d}W n tjk
r2   tdY nX t|d d }|dkrZtd||d | _|d | _y(ddd	d
d| j| jf \}| _| _	W n. t
k
r   td| j d| j dY nX y,| |\
}| _}}| _}| _}| _| _W n0 tjk
r" } ztd|W d 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	>IIIIIIII)r   r   r   )z<HHIQQQIHHHz	<IIQQQQQQ)r   r   r   )z>HHIQQQIHHHz	>IIQQQQQQ)r   r   r   ))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__,   s.    

,zELFFile.__init__.)fmtr   c             C   s   t || jt |S )N)r   unpackr   readcalcsize)r+   r2   r	   r	   r
   r   Z   s    zELFFile._read)r   c          	   C   s   xt | jD ]}| j| j| j|   y| | j}W n tj	k
rP   wY nX || j
d  dkrfq| j|| j
d   t| j|| j
d  dS W 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fsdecoder4   strip)r+   indexdatar	   r	   r
   interpreter]   s    $zELFFile.interpreter)r   r   r   __doc__r   r    r1   strr   intr   propertyr   r>   r	   r	   r	   r
   r   '   s
   .r   )r?   enumr9   r   typingr   r   r   
ValueErrorr   IntEnumr   r   r   r   r	   r	   r	   r
   <module>	   s   