
    eO                        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      Z G d de      Z G d de      Z G d de      ZdddZddZddZddZdddZy)     )annotationsN   )
OrderedSetgenerate_list
Popen_safe                  i5  pFc                      e Zd ZddZy)	DataSizesc                P   |rd}nd}|dz   | _         d| _        |dz   | _        d| _        |dz   | _        d| _        |dk(  rE|d	z   | _        d
| _        |d	z   | _        d
| _	        |d	z   | _
        d
| _        |dz   | _        d
| _        y |dz   | _        d| _        |dz   | _        d| _	        y )N<>hr   I   i@   Q   q)HalfHalfSizeWordWordSizeSword	SwordSizeAddrAddrSizeOffOffSizeXWord	XWordSizeSxword
SxwordSize)selfptrsizeis_leps       =/usr/lib/python3/dist-packages/mesonbuild/scripts/depfixer.py__init__zDataSizes.__init__'   s    AAG	G	W
b=CDIDM3wDHDLSDJDNc'DKDOCDIDM3wDHDL    N)r*   intr+   boolreturnNone)__name__
__module____qualname__r.    r/   r-   r   r   &   s    r/   r   c                  (     e Zd Zd fdZddZ xZS )DynamicEntryc                H   t         |   ||       || _        |dk(  rt        j                  | j
                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                              d   | _        y t        j                  | j                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                              d   | _        y Nr   r   )superr.   r*   structunpackr'   readr(   d_tagr%   r&   valr   r    r   r   )r)   ifiler*   r+   	__class__s       r-   r.   zDynamicEntry.__init__B   s    %(b=t{{EJJt4OPQRSDJ}}TZZDNN1KLQODHtzz5::dnn3MNqQDJ}}TYY

4==0IJ1MDHr/   c                   | j                   dk(  rs|j                  t        j                  | j                  | j
                               |j                  t        j                  | j                  | j                               y |j                  t        j                  | j                  | j
                               |j                  t        j                  | j                  | j                               y )Nr   )
r*   writer=   packr'   r@   r%   rA   r   r   )r)   ofiles     r-   rE   zDynamicEntry.writeL   s    <<2KKDKK<=KKDJJ9:KKDJJ

;<KKDIItxx89r/   rB   
T.BinaryIOr*   r0   r+   r1   r2   r3   )rG   rI   r2   r3   )r4   r5   r6   r.   rE   __classcell__rC   s   @r-   r9   r9   A   s    N:r/   r9   c                        e Zd Zd fdZ xZS )SectionHeaderc                d   t         |   ||       |dk(  }t        j                  | j                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                              d   | _        |rBt        j                  | j                  |j                  | j                              d   | _        nAt        j                  | j                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                               d   | _        |rBt        j                  | j                  |j                  | j                              d   | _        nAt        j                  | j                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                              d   | _        t        j                  | j                  |j                  | j                              d   | _        |rBt        j                  | j                  |j                  | j                              d   | _        nAt        j                  | j                  |j                  | j                              d   | _        |rBt        j                  | j                  |j                  | j                              d   | _        y t        j                  | j                  |j                  | j                              d   | _        y r;   )r<   r.   r=   r>   r   r?   r   sh_namesh_typer%   r&   sh_flagsr!   r"   sh_addrr#   r$   	sh_offsetsh_sizesh_linksh_infosh_addralign
sh_entsize)r)   rB   r*   r+   is_64rC   s        r-   r.   zSectionHeader.__init__U   sb   %(2 }}TYY

4==0IJ1M}}TYY

4==0IJ1M"MM$**ejj6PQRSTDM"MM$))UZZ5NOPQRDM}}TYY

4==0IJ1MtxxDLL1IJ1M!==UZZ5OPQRSDL!==EJJt}}4MNqQDL}}TYY

4==0IJ1M}}TYY

4==0IJ1M &djj%**T^^:T UVW XD &diiDMM9R STU VD$mmDJJ

4>>8RSTUVDO$mmDIIuzz$--7PQRSTDOr/   rH   )r4   r5   r6   r.   rJ   rK   s   @r-   rM   rM   T   s    #U #Ur/   rM   c                       e Zd Zdd fdZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZed d       Zd!dZd"dZd!dZd!dZed d       Zd#dZd$dZd%dZd&dZ xZS )'Elfc                   || _         || _        g | _        g | _        | j	                  |       	 | j                         \  | _        | _        t        | %  | j                  | j                         | j                          | j                          | j                          y # t        j                  t        f$ r | j!                           w xY wN)bfileverbosesectionsdynamicopen_bfdetect_elf_typer*   r+   r<   r.   parse_headerparse_sectionsparse_dynamicr=   errorRuntimeErrorclose_bf)r)   r^   r_   rC   s      r-   r.   zElf.__init__{   s    
/1-/U	)-)=)=)?&T\4:GT\\4::6! l+ 	MMO	s   A1B" "+Cc                   d | _         d | _        	 t        |d      | _         y # t        $ r}t	        j
                  t        j                  |      j                        | _        t        j                  |t        j                  t        j                  z  t        j                  z         	 t        |d      | _         n6# t        $ r* t        j                  || j                         d | _        |w xY wY d }~y d }~ww xY 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)   r^   es      r-   rb   zElf.open_bf   s    
	5%(DG 	 LL%)@)@ADMHHUDLL4==84<<GHue, . $ 		s-   " 	C;A=C6)B;:C6;3C..C66C;c                    | j                   m| j                  ?t        j                  | j                   j	                         | j                         d | _        | j                   j                          d | _         y y r]   )rk   rl   rq   rt   filenocloser)   s    r-   ri   zElf.close_bf   sS    77}}()4==9 $GGMMODG r/   c                    | S r]   r7   r}   s    r-   	__enter__zElf.__enter__   s    r/   c                $    | j                          y r]   ri   r}   s    r-   __del__zElf.__del__       r/   c                $    | j                          y r]   r   )r)   exc_type	exc_value	tracebacks       r-   __exit__zElf.__exit__   r   r/   c                   | j                   j                  d      }|dd dk7  r:| j                  rt        d| j                  d       t        j                  d       |d   dk(  rd}n.|d   d	k(  rd
}n#t        j                  d| j                  d       |d   dk(  rd}|fS |d   d	k(  rd}|fS t        j                  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.)rk   r?   r_   printr^   sysexit)r)   datar*   r+   s       r-   rc   zElf.detect_elf_type   s    ww||A!9 ||djj^+?@AHHQK7a<G!W\GHHuTZZN*ABC7a<E
 ~	 !W\E ~ HHuTZZN*FGH~r/   c                F   | j                   j                  d       t        j                  d| j                   j	                  d            d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _	        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                   | j                   j	                  | j"                              d   | _        t        j                  | j                   | j                   j	                  | j"                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        t        j                  | j                  | j                   j	                  | j                              d   | _        y )Nr   16s   )rk   seekr=   r>   r?   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_shstrndxr}   s    r-   rd   zElf.parse_header   sv   Q}}UDGGLL,<=a@mmDIItww||DMM/JKANtyy$'',,t}}2MNqQtyy$'',,t}}2MNqQ}}TYYT]]0KLQO}}TXXtww||DLL/IJ1M}}TXXtww||DLL/IJ1M}}TYYT]]0KLQOdiidmm1LMaP!==DGGLL4OPQRS}}TYYT]]0KLQO!==DGGLL4OPQRS}}TYYT]]0KLQO --		477<<3NOPQRr/   c                
   | j                   j                  | j                         t        | j                        D ]F  }| j
                  j                  t        | j                   | j                  | j                               H y r]   )
rk   r   r   ranger   r`   appendrM   r*   r+   )r)   _s     r-   re   zElf.parse_sections   sW    T\\"t||$ 	SAMM  twwdjj!QR	Sr/   c                    g }| j                   j                  d      }|dk7  rB|j                  |       | j                   j                  d      }|dk(  rt        d      |dk7  rBdj	                  |      S )Nr	       r/   z&Tried to read past the end of the file)rk   r?   r   rh   join)r)   arrxs      r-   read_strzElf.read_str   sg    GGLLO5jJJqMQACx"#KLL	 5j
 xx}r/   c                    | j                   | j                     }| j                   D ]M  }| j                  j                  |j                  |j
                  z          | j                         }||k(  sK|c S  y r]   )r`   r   rk   r   rS   rO   r   )r)   target_namesection_namesr   names        r-   find_sectionzElf.find_section   sc    doo6 	AGGLL00199<===?D{"		
 r/   c                $   | j                  d      }|y | j                  j                  |j                         	 t	        | j                  | j
                  | j                        }| j                  j                  |       |j                  dk(  ry W)N   .dynamicr   )
r   rk   r   rS   r9   r*   r+   ra   r   r@   )r)   secry   s      r-   rf   zElf.parse_dynamic   sp    ,;S]]#TWWdllDJJ?ALL"ww!|	 r/   c              #    K   | j                   | j                     }| j                   D ]T  }| j                  j                  |j                  |j
                  z          | j                         j                          V y wr]   )r`   r   rk   r   rS   rO   r   decode)r)   r   r   s      r-   get_section_nameszElf.get_section_names   s_     doo6 	+AGGLL00199<=--/((**	+s   A>B c                ,   d }d }| j                   D ]-  }|j                  t        k(  r|}|j                  t        k(  s,|}/ ||y | j                  j                  |j                  |j                  z          | j                         j                         S r]   )	ra   r@   	DT_SONAME	DT_STRTABrk   r   rA   r   r   )r)   sonamestrtabr   s       r-   
get_sonamezElf.get_soname   s     	Aww)#ww)#		
 >V^VZZ&**,-}}%%''r/   c                    | j                  d      }| j                  D ]@  }|j                  |k(  s|j                  |j                  z   }t        |t              sJ |c S  y N   .dynstr)r   ra   r@   rS   rA   
isinstancer0   )r)   entrynumr   r   ress        r-   get_entry_offsetzElf.get_entry_offset	  s]    
+ 	Aww("mmaee+!#s+++
		
 r/   c                    | j                  t              }|y | j                  j                  |       | j	                         j                         S r]   )r   DT_RPATHrk   r   r   r   r)   offsets     r-   	get_rpathzElf.get_rpath  s?    &&x0>V}}%%''r/   c                    | j                  t              }|y | j                  j                  |       | j	                         j                         S r]   )r   
DT_RUNPATHrk   r   r   r   r   s     r-   get_runpathzElf.get_runpath  s?    &&z2>V}}%%''r/   c              #     K   | j                  d      }| j                  D ]j  }|j                  t        k(  s|j                  |j
                  z   }| j                  j                  |       | j                         j                          l y wr   )
r   ra   r@   	DT_NEEDEDrS   rA   rk   r   r   r   )r)   r   r   r   s       r-   get_depszElf.get_deps   sl     
+ 	/Aww)#.V$mmo,,..		/s   4BABc                X   | j                  d      }g }| j                  D ]'  }|j                  t        k(  s|j	                  |       ) |D ]  }|j
                  |j                  z   }| j                  j                  |       | j                         }|j                  |      sY|j                  dd      d   }dt        |      t        |      z
  z  }||z   }	t        |	      t        |      k(  sJ | j                  j                  |       | j                  j                  |	        y )Nr      /r	   )maxsplitr   )r   ra   r@   r   r   rS   rA   rk   r   r   
startswithrsplitlenrE   )
r)   prefixr   depsr   r   r   basenamepaddingnewnames
             r-   fix_depszElf.fix_deps)  s    
+ 	Aww)#A	  
	'A]]QUU*FGGLL ==?Dv&;;ta;8<3t9s8}#<="W,7|s4y000V$g&
	'r/   c                d    | j                  |||t               | j                  |||t               y r]   )fix_rpathtype_entryr   r   )r)   fnamerpath_dirs_to_remove	new_rpaths       r-   	fix_rpathzElf.fix_rpath;  s.     	  (<iR  (<iTr/   c                :   | j                  |      }|| j                  rt        d|d       y | j                  j	                  |       | j                         }t               }|r |j                  |j                  d             |rA|j                  d      D ]-  }||v r|dt        |      z  k(  r|s|j                  |       / dj                  |      }t        |      t        |      k  rEdj                  |j                  d      |j                  d            }	t        j                  |	       |s| j!                  |       y | j                  j	                  |       | j                  j#                  |       | j                  j#                  d       y )Nr   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   r_   r   rk   r   r   r   updatesplitr   addr   formatr   r   r   remove_rpath_entryrE   )
r)   r   r   r   r   rp_off	old_rpath
new_rpaths	rpath_dirmsgs
             r-   r   zElf.fix_rpathtype_entryA  sh   &&x0>||eY&fghVMMO	 )3
iood34 '__T2 2	!%99!dS^&;< "y1	2 IIj)	y>C	N*V]]^g^n^nov^w  zC  zJ  zJ  KR  zS  TCHHSM ##H-GGLL GGMM)$GGMM% r/   c                H   | j                  d      }|y t        | j                        D ]W  \  }}|j                  |k(  s| j                  |   }d|_        | j                  d | | j                  |dz   d  z   |gz   | _         n | j                  d  D ]<  }|j                  t        k(  s|xj
                  d| j                  dz  z  z  c_         n | j                  j                  |j                         | j                  D ]  }|j                  | j                          y )Nr   r   r	   r   r   )r   	enumeratera   r@   DT_MIPS_RLD_MAP_RELrA   r*   rk   r   rS   rE   )r)   r   r   r   entryrpentrys         r-   r   zElf.remove_rpath_entryn  s
   ,;#DLL1 	JQ{{h&,,q/ !#||BQ/$,,q1uv2FF'R	 \\!"% 	E{{11		Q$,,!"344		 	S]]#\\ 	!EKK 	!r/   T)r^   strr_   r1   r2   r3   )r^   r   r2   r3   )r2   r3   )r2   z'Elf')r   T.Anyr   r   r   r   r2   r3   )r2   zT.Tuple[int, bool])r2   bytes)r   r   r2   zT.Optional[SectionHeader])r2   zT.Generator[str, None, None])r2   zT.Optional[str])r   r0   r2   zT.Optional[int])r   r   r2   r3   )r   r   r   T.Set[bytes]r   r   r2   r3   )
r   r   r   r   r   r   r   r0   r2   r3   )r   r0   r2   r3   )r4   r5   r6   r.   rb   ri   r   r   r   rc   rd   re   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   rJ   rK   s   @r-   r[   r[   z   s     ,S"S
	 + +((( / /'$U+!Zr/   r[   c                r    |)t        | |      5 }|j                  | ||       d d d        y y # 1 sw Y   y xY wr]   )r[   r   )r   r   r   r_   ry   s        r-   fix_elfr     sI      	@AKK3Y?	@ 	@ 	@ 	@s   -6c                   t        dd| gt        j                        \  }}}|j                  dk7  r+t        j                  |j                  |j
                  |      g }d}|j                  d      D ]  }|j                         }d|vr|j                         j                  dd      \  }}|d	k(  r|}|d
k(  sH|dk(  sN|j                  dd      d   j                         }	|j                  |	        |S )Notoolz-l)stderrr   FOOBAR
 r	   cmdpathLC_RPATH()	r   
subprocessDEVNULL
returncodeCalledProcessErrorargsr   stripr   )
r   r,   outr   resultcurrent_cmdlinekeyvaluerps
             r-   get_darwin_rpaths_to_remover    s    GT51*:L:LMIAsA||q++ALL!&&#FFFK		$ 	zz|d?ZZ\''Q/
U%<K&=[J6S!$Q'--/BMM"	 Mr/   c                2   	 t        |       }	 g }|rPt        |      D ]	  }|d|gz  } t        j                  d| g|z   t        j
                  t        j
                         g }|r|d|gz  }| j                  d      r|d|gz  }|r |j                         D ]  \  }}|d||gz  } |r:t        j                  d| g|z   t        j
                  t        j
                         y y # t        j                  $ r Y y w xY w# t        $ r}	t        |	      d }	~	ww xY w)Nz-delete_rpathinstall_name_tool)stdoutr   z
-add_rpathdylibz-idz-change)
r  r  r
  r   
check_callr  endswithitemsrx   
SystemExit)
r   r   
final_pathinstall_name_mappingsrpathsr  r  oldnewerrs
             r-   
fix_darwinr#    sB   ,U3
)( !( ."--.!!#6">"E)3););)3););= \9--D>>'"UJ''D 1779 .SC--.!!#6">"E)3););)3););= Q ((  	X  os)   C$ CC= $C:9C:=	DDDc                d   t        j                  dd| dg       t        ddd      5 }|j                         }|j	                  d       |D ]%  }|j                  d      r|j                  |       ' |j                          d d d        t        j                  dd	| dg       y # 1 sw Y   #xY w)
NjarxfzMETA-INF/MANIFEST.MFzr+r   )encodingr   zClass-Path:ufM)r  r  rm   	readlinesr   r   rE   truncate)r   flinesr  s       r-   fix_jarr-    s    5$/EFG	$dW	= 	q	 	D??=1	 	


 5%0FGH s   8B&!#B&&B/c                   | j                  d      ry 	 | j                  d      rt        |        y t        |t              r|j	                  d      }t        | |||       y # t        $ r5}t        |j                  t              r|j                  dk(  rn Y d }~nd }~ww xY wt        du rt        t        j                  d            a	t        r0t        |t              r|j                  d      }t        | |||       y y )N)z.az.libz.pdbz.hz.hppz.dllz.exez.jarutf8r   Fr  )r  r-  r   r   encoder   r  coder0   INSTALL_NAME_TOOLr1   shutilwhichr   r   r#  )r   r   r   r  r  r_   ry   s          r-   r   r     s    
 ~~JK>>&!ENi%!((0I+Y@ affc"qvv{  E! .A!BCi'!((0I5)Z1FG s   A! /A! !	B*+BBr   )
r   r   r   r   r   zT.Optional[bytes]r_   r1   r2   r3   )r   r   r2   zT.List[str])
r   r   r   r   r  r   r  T.Dict[str, str]r2   r3   )r   r   r2   r3   )r   r   r   r   r   zT.Union[str, bytes]r  r   r  r5  r_   r1   r2   r3   )
__future__r   r   rq   ro   r=   r3  r  typingTmesonlibr   r   r   
SHT_STRTABr   r   r   r   r   r   r2  r   r9   rM   r[   r   r  r#  r-  r   r7   r/   r-   <module>r;     s    #  	      < <
	
		     6:9 :&$UI $ULF) FP@$0dI Hr/   