o
    ldO                     @  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.   zhome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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 | _|rt| j	|| j
d | _nt| j|| jd | _|rt| 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]   fchmodfilenocloser,   r.   r.   r/   rV      s   



zElf.close_bf'Elf'c                 C  s   | S rL   r.   ri   r.   r.   r/   	__enter__   s   zElf.__enter__c                 C     |    d S rL   rV   ri   r.   r.   r/   __del__      zElf.__del__exc_typeT.Any	exc_value	tracebackc                 C  rl   rL   rm   )r,   rp   rr   rs   r.   r.   r/   __exit__   ro   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   e_type	e_machiner    r!   	e_versionr$   r%   e_entryr&   r'   e_phoffe_shoffe_flagse_ehsizee_phentsizee_phnume_shentsizee_shnum
e_shstrndxri   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,   Z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   )maxsplitr   )r   rN   r<   r   r   rG   r=   rW   r~   r   
startswithrsplitlenrA   )
r,   r   r   depsr   r   r   basenamepaddingZ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 )Nrw   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   ry   rW   r~   r   r   updatesplitr   addr   formatr   rz   r{   remove_rpath_entryrA   )
r,   r   r   r   r   Zrp_offZ	old_rpathZ
new_rpathsZ	rpath_dirmsgr.   r.   r/   r   A  s6   



	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   rj   )rp   rq   rr   rq   rs   rq   r   r   )r   ru   )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   rk   rn   rt   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 )
NZjarZ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   rz   r]   r[   r9   r  r   typingTZ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