o
    uJAfÇO  ã                   @  sð   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	ddl
mZmZmZ dZdZdZdZd	Zd
ZdZdaG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZd/d0d d!„Zd1d#d$„Zd2d(d)„Zd3d*d+„Zd/d4d-d.„ZdS )5é    )ÚannotationsNé   )Ú
OrderedSetÚgenerate_listÚ
Popen_safeé   é   é   é   é   é   i5  pFc                   @  s   e Zd Zd
dd„Zd	S )Ú	DataSizesÚptrsizeÚintÚis_leÚboolÚreturnÚNonec                 C  s®   |rd}nd}|d | _ d| _|d | _d| _|d | _d| _|dkrE|d	 | _d
| _|d	 | _d
| _	|d	 | _
d
| _|d | _d
| _d S |d | _d| _|d | _d| _	d S )Nú<ú>Úhr   ÚIé   Úié@   ÚQé   Úq)ÚHalfÚHalfSizeÚWordÚWordSizeÚSwordÚ	SwordSizeÚAddrÚAddrSizeÚOffÚOffSizeÚXWordÚ	XWordSizeÚSxwordÚ
SxwordSize)Úselfr   r   Úp© r.   ú@/usr/lib/python3.10/site-packages/mesonbuild/scripts/depfixer.pyÚ__init__'   s,   










zDataSizes.__init__N)r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r0   r.   r.   r.   r/   r   &   s    r   c                      s(   e Zd Zd‡ fd	d
„Zddd„Z‡  ZS )ÚDynamicEntryÚifileú
T.BinaryIOr   r   r   r   r   r   c                   s”   t ƒ  ||¡ || _|dkr,t | j| | j¡¡d | _t | j	| | j
¡¡d | _d S t | j| | j¡¡d | _t | j| | j¡¡d | _d S ©Nr   r   )Úsuperr0   r   ÚstructÚunpackr*   Úreadr+   Úd_tagr(   r)   Úvalr"   r#   r    r!   )r,   r5   r   r   ©Ú	__class__r.   r/   r0   B   s     zDynamicEntry.__init__Úofilec                 C  sj   | j dkr| t | j| j¡¡ | t | j| j¡¡ d S | t | j| j¡¡ | t | j	| j¡¡ d S )Nr   )
r   Úwriter9   Úpackr*   r<   r(   r=   r"   r    )r,   r@   r.   r.   r/   rA   L   s
   
zDynamicEntry.write©r5   r6   r   r   r   r   r   r   )r@   r6   r   r   )r1   r2   r3   r0   rA   Ú__classcell__r.   r.   r>   r/   r4   A   s    
r4   c                      s   e Zd Zd‡ fd	d
„Z‡  ZS )ÚSectionHeaderr5   r6   r   r   r   r   r   r   c                   s¼  t ƒ  ||¡ |dk}t | j| | j¡¡d | _t | j| | j¡¡d | _|r8t | j	| | j
¡¡d | _nt | j| | j¡¡d | _t | j| | j¡¡d | _t | j| | j¡¡d | _|rst | j	| | j
¡¡d | _nt | j| | j¡¡d | _t | j| | j¡¡d | _t | j| | j¡¡d | _|r®t | j	| | j
¡¡d | _nt | j| | j¡¡d | _|rÎt | j	| | j
¡¡d | _d S t | j| | j¡¡d | _d S r7   )r8   r0   r9   r:   r    r;   r!   Úsh_nameZsh_typer(   r)   Zsh_flagsr$   r%   Zsh_addrr&   r'   Ú	sh_offsetZsh_sizeZsh_linkZsh_infoZsh_addralignZ
sh_entsize)r,   r5   r   r   Zis_64r>   r.   r/   r0   U   s(     zSectionHeader.__init__rC   )r1   r2   r3   r0   rD   r.   r.   r>   r/   rE   T   s    rE   c                      sú   e Zd ZdGdH‡ fdd	„ZdId
d„ZdJdd„ZdKdd„ZdJdd„ZdLdd„ZdMdd„Z	dJdd„Z
dJdd„ZdNd!d"„ZdOd%d&„ZdJd'd(„ZedPd*d+„ƒZdQd-d.„ZdRd2d3„ZdQd4d5„ZdQd6d7„ZedPd8d9„ƒZdSd;d<„ZdTdAdB„ZdUdCdD„ZdVdEdF„Z‡  ZS )WÚElfTÚbfileÚstrÚverboser   r   r   c              	     s‚   || _ || _g | _g | _|  |¡ z |  ¡ \| _| _tƒ  	| j| j¡ |  
¡  |  ¡  |  ¡  W d S  tjtfy@   |  ¡  ‚ w ©N)rI   rK   ÚsectionsÚdynamicÚopen_bfÚdetect_elf_typer   r   r8   r0   Úparse_headerÚparse_sectionsÚparse_dynamicr9   ÚerrorÚRuntimeErrorÚclose_bf)r,   rI   rK   r>   r.   r/   r0   {   s   
þzElf.__init__c                 C  s¬   d | _ d | _z	t|dƒ| _ W d S  tyU } z:t t |¡j¡| _t 	|tj
tjB tjB ¡ zt|dƒ| _ W n tyI   t 	|| j¡ d | _|‚w W Y d }~d S d }~ww )Nzr+b)ÚbfÚbf_permsÚopenÚPermissionErrorÚstatÚS_IMODEÚosÚlstatÚst_modeÚchmodÚS_IREADÚS_IWRITEÚS_IEXECÚ	Exception)r,   rI   Úer.   r.   r/   rO   ‹   s"   ýÿ€üzElf.open_bfc                 C  sF   | j d ur!| jd urt | j  ¡ | j¡ d | _| j  ¡  d | _ d S d S rL   )rW   rX   r]   r`   ÚfilenoÚclose©r,   r.   r.   r/   rV   š   s   



ûzElf.close_bfú'Elf'c                 C  s   | S rL   r.   rh   r.   r.   r/   Ú	__enter__¢   s   zElf.__enter__c                 C  ó   |   ¡  d S rL   ©rV   rh   r.   r.   r/   Ú__del__¥   ó   zElf.__del__Úexc_typeúT.AnyÚ	exc_valueÚ	tracebackc                 C  rk   rL   rl   )r,   ro   rq   rr   r.   r.   r/   Ú__exit__¨   rn   zElf.__exit__úT.Tuple[int, bool]c                 C  sÂ   | j  d¡}|dd… dkr| jrtd| j›dƒ t d¡ |d dkr(d}n|d d	kr1d
}n
t d| j›d¡ |d dkrGd}||fS |d d	krSd}||fS t d| j›d¡ ||fS )Né   r   r   s   ELFúFile z is not an ELF file.r   é    r   r   z has unknown ELF class.r   TFz has unknown ELF endianness.)rW   r;   rK   ÚprintrI   ÚsysÚexit)r,   Údatar   r   r.   r.   r/   rP   «   s$   
üÿzElf.detect_elf_typec                 C  s°  | j  d¡ t d| j  d¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _	t | j
| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j
| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _t | j| j  | j¡¡d | _d S )Nr   Z16sé   )rW   Úseekr9   r:   r;   Ze_identr   r   Ze_typeZ	e_machiner    r!   Z	e_versionr$   r%   Ze_entryr&   r'   Ze_phoffÚe_shoffZe_flagsZe_ehsizeZe_phentsizeZe_phnumZe_shentsizeÚe_shnumÚ
e_shstrndxrh   r.   r.   r/   rQ   Á   s   "zElf.parse_headerc                 C  s<   | j  | j¡ t| jƒD ]}| j t| j | j| j	ƒ¡ qd S rL   )
rW   r}   r~   Úranger   rM   ÚappendrE   r   r   )r,   Ú_r.   r.   r/   rR   Ò   s   ÿzElf.parse_sectionsÚbytesc                 C  sP   g }| j  d¡}|dkr#| |¡ | j  d¡}|dkrtdƒ‚|dksd |¡S )Nr   ó    ó    z&Tried to read past the end of the file)rW   r;   r‚   rU   Újoin)r,   ÚarrÚxr.   r.   r/   Úread_str×   s   
ü
zElf.read_strÚtarget_nameúT.Optional[SectionHeader]c                 C  sH   | j | j }| j D ]}| j |j|j ¡ |  ¡ }||kr!|  S q	d S rL   )rM   r€   rW   r}   rG   rF   rŠ   )r,   r‹   Úsection_namesr   Únamer.   r.   r/   Úfind_sectioná   s   
ÿzElf.find_sectionc                 C  sT   |   d¡}|d u rd S | j |j¡ 	 t| j| j| jƒ}| j |¡ |j	dkr)d S q)Nó   .dynamicTr   )
r   rW   r}   rG   r4   r   r   rN   r‚   r<   )r,   Úsecre   r.   r.   r/   rS   ê   s   

üzElf.parse_dynamicúT.Generator[str, None, None]c                 c  s@    | j | j }| j D ]}| j |j|j ¡ |  ¡  ¡ V  q
d S rL   )rM   r€   rW   r}   rG   rF   rŠ   Údecode)r,   r   r   r.   r.   r/   Úget_section_namesõ   s   €
þzElf.get_section_namesúT.Optional[str]c                 C  sd   d }d }| j D ]}|jtkr|}|jtkr|}q|d u s |d u r"d S | j |j|j ¡ |  ¡  ¡ S rL   )	rN   r<   Ú	DT_SONAMEÚ	DT_STRTABrW   r}   r=   rŠ   r“   )r,   ZsonameZstrtabr   r.   r.   r/   Ú
get_sonameü   s   


€zElf.get_sonameÚentrynumr   úT.Optional[int]c                 C  sF   |   d¡}| jD ]}|j|kr |j|j }t|tƒsJ ‚|  S qd S ©Nó   .dynstr)r   rN   r<   rG   r=   Ú
isinstancer   )r,   r™   r‘   r   Úresr.   r.   r/   Úget_entry_offset	  s   


ýzElf.get_entry_offsetc                 C  ó.   |   t¡}|d u rd S | j |¡ |  ¡  ¡ S rL   )rŸ   ÚDT_RPATHrW   r}   rŠ   r“   ©r,   Úoffsetr.   r.   r/   Ú	get_rpath  ó
   
zElf.get_rpathc                 C  r    rL   )rŸ   Ú
DT_RUNPATHrW   r}   rŠ   r“   r¢   r.   r.   r/   Úget_runpath  r¥   zElf.get_runpathc                 c  sL    |   d¡}| jD ]}|jtkr#|j|j }| j |¡ |  ¡  	¡ V  q	d S r›   )
r   rN   r<   Ú	DT_NEEDEDrG   r=   rW   r}   rŠ   r“   )r,   r‘   r   r£   r.   r.   r/   Úget_deps   s   €


€üzElf.get_depsÚprefixc           
      C  sÀ   |   d¡}g }| jD ]}|jtkr| |¡ q
|D ]D}|j|j }| j |¡ |  	¡ }| 
|¡r]|jdddd }dt|ƒt|ƒ  }|| }	t|	ƒt|ƒksQJ ‚| j |¡ | j |	¡ qd S )Nrœ   ó   /r   )Úmaxsplitéÿÿÿÿr…   )r   rN   r<   r¨   r‚   rG   r=   rW   r}   rŠ   Ú
startswithÚrsplitÚlenrA   )
r,   rª   r‘   Údepsr   r£   rŽ   ÚbasenameÚpaddingÚnewnamer.   r.   r/   Úfix_deps)  s&   



€
€özElf.fix_depsÚfnameÚrpath_dirs_to_removeúT.Set[bytes]Ú	new_rpathc                 C  s$   |   |||t¡ |   |||t¡ d S rL   )Úfix_rpathtype_entryr¡   r¦   )r,   r¶   r·   r¹   r.   r.   r/   Ú	fix_rpath;  s   zElf.fix_rpathc           
      C  s
  |   |¡}|d u r| jrtd|›dƒ d S | j |¡ |  ¡ }tƒ }|r-| | d¡¡ |rJ| d¡D ]}||v sI|dt	|ƒ ksI|rI| 
|¡ q4d |¡}t	|ƒt	|ƒk rhd | d¡| d¡¡}	t |	¡ |sq|  |¡ d S | j |¡ | j |¡ | j d¡ d S )Nrv   z@ does not have an rpath. It should be a fully static executable.ó   :ó   Xz@New rpath must not be longer than the old one.
 Old: {}
 New: {}úutf-8r…   )rŸ   rK   rx   rW   r}   rŠ   r   ÚupdateÚsplitr°   Úaddr‡   Úformatr“   ry   rz   Úremove_rpath_entryrA   )
r,   r¶   r·   r¹   r™   Zrp_offZ	old_rpathZ
new_rpathsZ	rpath_dirÚmsgr.   r.   r/   rº   A  s4   

€

	zElf.fix_rpathtype_entryc                 C  sÔ   |   d¡}|d u rd S t| jƒD ]'\}}|j|kr7| j| }d|_| jd |… | j|d d …  |g | _ nq| j|d … D ]}|jtkrT| jd| jd  7  _ nq?| j |j	¡ | jD ]}| 
| j¡ q_d S )Nr   r   r   r   r   )r   Ú	enumeraterN   r<   ÚDT_MIPS_RLD_MAP_RELr=   r   rW   r}   rG   rA   )r,   r™   r‘   r   ÚentryZrpentryr.   r.   r/   rÃ   n  s&   


(ü
þ
zElf.remove_rpath_entry©T)rI   rJ   rK   r   r   r   )rI   rJ   r   r   )r   r   )r   ri   )ro   rp   rq   rp   rr   rp   r   r   )r   rt   )r   r„   )r‹   r„   r   rŒ   )r   r’   )r   r•   )r™   r   r   rš   )rª   r„   r   r   )r¶   rJ   r·   r¸   r¹   r„   r   r   )
r¶   rJ   r·   r¸   r¹   r„   r™   r   r   r   )r™   r   r   r   )r1   r2   r3   r0   rO   rV   rj   rm   rs   rP   rQ   rR   rŠ   r   rS   r   r”   r˜   rŸ   r¤   r§   r©   rµ   r»   rº   rÃ   rD   r.   r.   r>   r/   rH   z   s2    











	


	



-rH   Tr¶   rJ   r·   r¸   r¹   úT.Optional[bytes]rK   r   r   r   c                 C  sJ   |d ur#t | |ƒ}| | ||¡ W d   ƒ d S 1 sw   Y  d S d S rL   )rH   r»   )r¶   r·   r¹   rK   re   r.   r.   r/   Úfix_elf‚  s
   "þÿrÊ   úT.List[str]c           
      C  s²   t dd| gtjd\}}}|jdkrt |j|j|¡‚g }d}| d¡D ]2}| ¡ }d|vr/q$| ¡  dd¡\}}|d	kr?|}|d
krV|dkrV| dd¡d  ¡ }	| |	¡ q$|S )NZotoolz-l)Ústderrr   ZFOOBARÚ
ú r   ÚcmdÚpathZLC_RPATHú()	r   Ú
subprocessÚDEVNULLÚ
returncodeÚCalledProcessErrorÚargsrÀ   Ústripr‚   )
r¶   r-   Úoutrƒ   ÚresultZcurrent_cmdÚlineÚkeyÚvalueÚrpr.   r.   r/   Úget_darwin_rpaths_to_removeˆ  s"   

€rÞ   Ú
final_pathÚinstall_name_mappingsúT.Dict[str, str]c           
   
   C  sþ   zt | ƒ}W n tjy   Y d S w z\g }|r2t|ƒD ]}|d|g7 }qtjd| g| tjtjd g }|r<|d|g7 }|  d¡rG|d|g7 }|rY| ¡ D ]\}}|d||g7 }qM|rltjd| g| tjtjd W d S W d S  ty~ }	 zt	|	ƒ‚d }	~	ww )Nz-delete_rpathÚinstall_name_tool)ÚstdoutrÌ   z
-add_rpathÚdylibz-idz-change)
rÞ   rÒ   rÕ   r   Ú
check_callrÓ   ÚendswithÚitemsrd   Ú
SystemExit)
r¶   r¹   rß   rà   ZrpathsrÖ   rÝ   ÚoldÚnewÚerrr.   r.   r/   Ú
fix_darwinš  s@   ýþ
þÿ€ÿrì   c                 C  sŽ   t  dd| dg¡ tdddd$}| ¡ }| d¡ |D ]}| d¡s(| |¡ q| ¡  W d   ƒ n1 s7w   Y  t  dd	| dg¡ d S )
NÚjarÚxfzMETA-INF/MANIFEST.MFzr+r¾   )Úencodingr   zClass-Path:ZufM)rÒ   rå   rY   Ú	readlinesr}   r®   rA   Útruncate)r¶   ÚfÚlinesrÚ   r.   r.   r/   Úfix_jarÌ  s   


€
úrô   úT.Union[str, bytes]c              
   C  sÒ   |   d¡rd S z |   d¡rt| ƒ W d S t|tƒr| d¡}t| |||ƒ W d S  tyF } zt|jtƒr;|jdkr;n‚ W Y d }~nd }~ww t	du rRt
t d¡ƒa	t	rgt|tƒr^| d¡}t| |||ƒ d S d S )N)z.az.libz.pdbz.hz.hppz.dllz.exez.jarÚutf8r   Frâ   )ræ   rô   r   rJ   ÚencoderÊ   rè   Úcoder   ÚINSTALL_NAME_TOOLr   ÚshutilÚwhichr„   r“   rì   )r¶   r·   r¹   rß   rà   rK   re   r.   r.   r/   r»   Ü  s0   



þ€þ	

ýr»   rÈ   )
r¶   rJ   r·   r¸   r¹   rÉ   rK   r   r   r   )r¶   rJ   r   rË   )
r¶   rJ   r¹   rJ   rß   rJ   rà   rá   r   r   )r¶   rJ   r   r   )r¶   rJ   r·   r¸   r¹   rõ   rß   rJ   rà   rá   rK   r   r   r   )Ú
__future__r   ry   r]   r[   r9   rú   rÒ   ÚtypingÚTÚmesonlibr   r   r   Z
SHT_STRTABr¨   r¡   r¦   r—   r–   rÆ   rù   r   r4   rE   rH   rÊ   rÞ   rì   rô   r»   r.   r.   r.   r/   Ú<module>   s8   &  



2