a
    	”$aæV  ã                   @   s@  d dl Z d dlZd dlZd dlmZmZmZmZmZ d dl	m
Z
 d dlmZmZmZ d8dd„Zdd	„ Zd
d„ Ze d¡Ze 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d$d%„ Z d&d'„ Z!d(d)„ Z"d*d+„ Z#d,d-„ Z$d.d/„ Z%d9d0d1„Z&d2d3„ Z'd4d5„ Z(e(ej)_(d6d7„ Z*e*ej)_*dS ):é    N)ÚUtilsÚBuildÚOptionsÚLogsÚErrors)Údebug)ÚTO_LISTÚLOCAL_CACHEÚget_tgt_listFc                 C   sÒ  i }| j jsi | j _t|ƒ ¡ }tƒ }|D ]0}|| j jv rP| j j|  ¡ ||< q*| |¡ q*|}t|ƒdkrp|S dg}|r„| d¡ | t|ƒ¡ t	j
|t	jdj}t|ƒdkrÎt|ƒd }tƒ tƒ dœ||< |D ]¸}	|	 ¡ }	|	 d¡r
|	dd	… }tƒ tƒ dœ||< qÒ|	 d
¡}
|
dgkr"qÒt|
ƒdkrB|
d }|
d }n|
d }|
d }|dv rp|| d  |¡ qÒ|dv rÒ|| d  |¡ qÒ|D ]<}||v r´||  ¡ | j j|< ntƒ tƒ dœ| j j|< q|S )z|extract symbols from objfile, returning a dictionary containing
       the set of undefined and public symbols for each filer   Znmz-D©Ústdouté   )ÚPUBLICÚ	UNDEFINEDó   :Néÿÿÿÿó    ó    é   é   s	   BDGTRVWSir   ó   Ur   )ÚenvZnm_cacheÚsetÚcopyÚaddÚlenÚappendÚextendÚlistÚ
subprocessÚPopenÚPIPEr   ÚstripÚendswithÚsplit)ÚbldZobjfilesÚdynamicÚretÚ	remainingÚobjÚcmdZnmpipeÚfilenameÚlineÚcolsZsymbol_typeÚsymbol© r/   úh/home/jack/SDK/ZBT-AX3000-OpenWrt-21.02/build_dir/hostpkg/samba-4.14.12/./buildtools/wafsamba/symbols.pyÚsymbols_extract   sV    




r1   c                 C   s   |   d¡dkr| d d… } | S )Nú.objlistr   iøÿÿÿ)Úfind)Únamer/   r/   r0   Ú	real_name\   s    r5   c                 C   s¸   d}| j jsi | j _|| j jv r,| j j| S tjd|gtjdj}|D ]`}| ¡ }| d¡}t|ƒdk sF|d dkrvqF|d  	d	¡r|d
 | j _
|d  	|¡rF|d
 }qF|| j j|< |S )ú0find the path to the syslib we will link againstNZlddr   r   r   r   s   =>r   s   libc.r   )r   Úsyslib_pathsr   r    r!   r   r"   r$   r   Ú
startswithÚ	libc_path)r%   ÚlibnameÚbinaryr'   Zlddpiper,   r-   r/   r/   r0   Úfind_ldd_pathb   s"    

r<   s   Shared library: \[(.*)\]s!   Library (rpath|runpath): \[(.*)\]c                 C   s&  | j jsi | j _|| j jv r,| j j|  ¡ S g }tƒ }tjdd|gtjdj}|D ]F}t 	|¡}|rt| 
| d¡¡ t 	|¡}|rR| | d¡ d¡¡ qRtƒ }|D ]l}d}	|D ]8}
tj |
|¡}tj |¡r°| 
tj |¡¡ d}	 qêq°|	s¤t| ||ƒ}|r¤| 
tj |¡¡ q¤| ¡ | j j|< |S )	zÛfind the list of linked libraries for any binary or library
    binname is the path to the binary/library on disk

    We do this using readelf instead of ldd as we need to avoid recursing
    into system libraries
    Zreadelfz	--dynamicr   r   r   r   FT)r   Z	lib_cacher   r   r   r    r!   r   Úre_sharedlibÚsearchr   ÚgroupÚre_rpathr   r$   ÚosÚpathÚjoinÚexistsÚrealpathr<   )r%   ÚbinnameÚrpathÚlibsZelfpiper,   Úmr'   ÚlibÚfoundÚrrB   r/   r/   r0   Úget_libs~   s:    	

rM   c                 C   sN   ||v rt ƒ S t| |ƒ}| |¡ |D ]"}|| jjv r&| t| ||ƒ¡}q&|S )z©find the recursive list of linked libraries for any binary or library
    binname is the path to the binary/library on disk. seen is a set used
    to prevent loops
    )r   rM   r   r   Úlibrary_dictÚunionÚget_libs_recursive)r%   rF   Úseenr'   rJ   r/   r/   r0   rP   °   s    

rP   c                 C   s@   |d j jd  | j¡}|dkr,|| jj7 }t| d| ¡  |ƒS )r6   r   Úpythonzlib%s)Ú	link_taskÚoutputsÚabspathr   ZPYTHON_VERSIONr<   Úlower)r%   r:   ÚdepsÚlinkpathr/   r/   r0   Úfind_syslib_pathÄ   s    rY   c                 C   sž  | j jrdS g }i }|D ]X}tƒ |_tƒ |_tƒ |_t|dg ƒD ].}|jD ]"}| | j ¡}| |¡ |||< qJq@qt	| |ƒ}|D ]N}	||	 }|j 
||	 d ¡|_|j 
||	 d ¡|_|j 
||	 d ¡|_q€|j |j¡|_i | j _|D ]B}|jD ]6}
|
| j jvrg | j j|
< | j j|
  t|jƒ¡ qöqìt| dƒ}i | j _|D ]¢}t|jƒ}|| j jv r€| j j|  
|j¡| j j|< n|j| j j|< |jdkrF|jD ]D}|  |¡}|  |dud||f ¡ | j j|  
|j¡| j j|< q qFi | j _|D ]¢}t|jƒ}|| j jv r0| j j|  
|j¡| j j|< n|j| j j|< |jdkrö|jD ]D}|  |¡}|  |dud||f ¡ | j j|  
|j¡| j j|< qPqödS )zIbuild the public_symbols and undefined_symbols attributes for each targetNÚcompiled_tasksr   r   ÚTARGET_TYPEÚLIBRARYz(Library '%s' has unknown dependency '%s')r   Úpublic_symbolsr   Úundefined_symbolsÚused_symbolsÚgetattrrT   rU   r   r1   rO   Ú
differenceÚ
symbol_mapr5   Úsnamer	   Ú
samba_typeÚadd_objectsÚget_tgen_by_nameÚASSERT)r%   Útgt_listZobjlistÚobjmapÚtÚtskÚoutputZobjpathÚsymbolsr)   ÚsÚtargetsr4   ÚdepÚt2r/   r/   r0   Úbuild_symbol_setsÑ   sb    







$


rr   c                 C   sV   | j jrdS i | j _|D ]8}|jdv rtj |jjd  | j ¡¡}|j	| j j|< qdS )z!build the library_dict dictionaryN)r\   ÚPYTHONr   )
r   rN   rd   rA   rB   rE   rS   rT   rU   rc   )r%   rh   rj   rX   r/   r/   r0   Úbuild_library_dict  s    
rt   c           
      C   sš  | j jrdS i }i }|D ]P}t|dg ƒr|jdv r|jD ].}|dv rHd}||vrXg ||< ||  |¡ q8qg }|D ]H}t| ||| ƒ}|du rœt d| ¡ |durr| |¡ | 	¡ ||< qr| | j j
¡ d|| j j
< t| |dd	}i | j _|D ]}|| d
 | j j|< qð|D ]J}|| d
 D ]6}	|	| j jvr<g | j j|	< | j j|	  || ¡ qq|| j j
 d
 | j _| j jD ]}| j j| | j j|| < qvdS )z(build the public_symbols for all syslibsNÚuselib)r\   ÚBINARYrs   )ÚPYEMBEDZPYEXTrR   z!Unable to find syslib path for %sÚcT©r&   r   )r   Úsyslib_symbolsr`   rd   ru   r   rY   r   ÚwarnrV   r9   r1   rb   Zlibc_symbolsr]   )
r%   rh   Úsyslibsri   rj   rJ   r7   rB   rm   Úsymr/   r/   r0   Úbuild_syslib_sets!  sD    

r~   c                 C   sä   t ƒ }t|jƒ}t| dƒ}|jD ]¸}||jv r0q || jjv r | jj| }||gkrTq |j|kr`q |d dv rnq ||d  dv rŽ| 	|d ¡ q |  
|d ¡}t|jƒdkrº| 	|d ¡ q |j|jkrÈq | 	|jd ¡ q ||_dS )z*build the set of dependencies for a targetr[   r   )rx   rR   )ÚSYSLIBr   N)r   r5   rc   r	   r^   r]   r   rb   Ú
in_libraryr   rf   r   Úautodeps)r%   rj   rW   r4   ro   r}   Zdepnamerq   r/   r/   r0   Úbuild_autodepsX  s2    





r‚   c                 C   sz   | j jrdS |D ]
}g |_q|D ]L}|jdv r |jD ]6}|  |¡}|r4|jdv r4|j|jvr4|j |j¡ q4q d| j _dS )zDadd a in_library attribute to all targets that are part of a libraryN)r\   )Ú	SUBSYSTEMÚASN1T)r   Zdone_build_library_namesr€   rd   Úsamba_deps_extendedrf   rc   r   )r%   rh   rj   r)   rq   r/   r/   r0   Úbuild_library_names{  s    


r†   c                 C   s    t |jƒ}t|jƒdkr.t d|j|jf ¡ |jD ]f}|  |¡}|du rLq4|jD ]F}||krR|j|jkrRt d|t |jƒf ¡ t d|j|jf ¡ qRq4dS )zpcheck that all the autodeps that have mutual dependency of this
    target are in the same library as the targetr   z.WARNING: Target '%s' in multiple libraries: %sNz$WARNING: mutual dependency %s <=> %sz Libraries should match. %s != %s)r5   rc   r   r€   r   r{   r   rf   )r%   rj   r4   rp   rq   Zdep2r/   r/   r0   Úcheck_library_depsŽ  s    



r‡   c                 C   s`   d}|D ]D}| j jD ]6}|j | j j| ¡}|rt d|j||f ¡ d}qq|r\t d¡‚dS )a  check if a target has any symbol collisions with a syslib

    We do not want any code in Samba to use a symbol name from a
    system library. The chance of that causing problems is just too
    high. Note that libreplace uses a rep_XX approach of renaming
    symbols via macros
    Fz@ERROR: Target '%s' has symbols '%s' which is also in syslib '%s'Tz'symbols in common with system librariesN)	r   rz   r]   Úintersectionr   Úerrorrc   r   ÚWafError)r%   rh   Z	has_errorrj   rJ   Úcommonr/   r/   r0   Úcheck_syslib_collisions¢  s    	rŒ   c              
   C   sT  |   |jd ¡rdS t| dƒ}|j ¡ }| |j¡}t|jƒ}t|j	ƒ}|j	D ]j}|| dv r`qN|  
|| jjv d| ¡ | | jj| ¡}|s®|| dkr®t d||f ¡ qN| |¡}qNtƒ |_i }|D ]Z}	|	| jjv r| jj|	 }
|
d |vrtƒ ||
d < ||
d   |	¡ qÊ|j |	¡ qÊ|D ]$}
t d	||
d
 ||
 ¡f ¡ q*dS )z,check for depenencies that should be changedr2   Nr[   )ÚEMPTYÚDISABLEDr   Ú	GENERATORz.Failed to find symbol list for dependency '%s'r\   z#Target '%s' has no dependency on %sr   z.Target '%s' should add dep '%s' for symbols %sú )rf   rc   r	   r^   r   ra   r]   r5   r   Ú
samba_depsrg   r   rˆ   r   ÚinfoÚunsatisfied_symbolsrb   r   rC   )r%   rj   ro   r(   rc   rW   ÚdÚdiffÚneededr}   rp   r/   r/   r0   Úcheck_dependencies¶  s4    




r—   c              
   C   s
  |   |jd ¡rdS t|jƒ}tƒ }t|jƒ}d|v s>d|v r`d| jjv r`|j 	| jjd ¡|_i }|jD ]V}|| jj
v r¶| jj
| d }|dkr”qj||vr¦tƒ ||< ||  |¡ qj| |¡ qj|D ]"}t d||d	 || ¡f ¡ qÆ|rtd
|d	 |¡f ƒ dS )zcheck for syslib depenenciesr2   NÚpyembedÚpyextrR   r   rx   z5Target '%s' should add syslib dep '%s' for symbols %sr   z-deps: Target '%s' has unsatisfied symbols: %s)rf   rc   r5   r   r   Úfeaturesr   r]   r“   ra   rb   r   r   r’   rC   r   )r%   rj   rc   r(   rš   r–   r}   rp   r/   r/   r0   Úcheck_syslib_dependenciesÞ  s,    



 r›   c                 C   sx   | j j}t|ƒ}t||ƒ t||ƒ |D ]"}tƒ |_t|ddƒr(t||ƒ q(|D ]}t	||ƒ qP|D ]}t
||ƒ qddS )z#check the internal dependency listsÚsourceÚ N)r   r%   r
   rr   r†   r   r   r`   r‚   r—   r‡   ©Útaskr%   rh   rj   r/   r/   r0   Úsymbols_symbolcheck  s    

r    c                 C   s<   | j j}t|ƒ}t||ƒ t||ƒ |D ]}t||ƒ q(dS )zcheck the syslib dependenciesN)r   r%   r
   r~   rŒ   r›   rž   r/   r/   r0   Úsymbols_syslibcheck  s    

r¡   c                 C   sú   | j j}t|ƒ}tjj d¡}t|ƒdkr4t 	d¡‚|d }|d }t
||ƒ t||ƒ t||ƒ t d||f ¡ ||j jvr’t d| ¡ dS ||j jvr°t d	| ¡ dS |j j|  |j j| ¡}|sât d
||f ¡ nt d|||f ¡ dS )z/check why 'target' needs to link to 'subsystem'ú:r   z"usage: WHYNEEDED=TARGET:DEPENDENCYr   r   z#Checking why %s needs to link to %sz/unable to find target '%s' in used_symbols dictNz4unable to find subsystem '%s' in public_symbols dictz4target '%s' doesn't use any public symbols from '%s'z%target '%s' uses symbols %s from '%s')r   r%   r
   r   ÚoptionsÚ	WHYNEEDEDr$   r   r   rŠ   rr   r†   r~   r   r’   r_   r{   r]   rˆ   )rŸ   r%   rh   ÚwhyÚtargetÚ	subsystemZoverlapr/   r/   r0   Úsymbols_whyneeded   s*    



r¨   c                 C   st   |dv rdS g }|D ].}|| j jv r8| | j j| ¡ q| |¡ q|r^t d|||f ¡‚ntd|||f ƒ dS )zreport duplicated symbols)Ú_initZ_finiZ_edataZ_endZ__bss_startNz-%s: Symbol %s linked in multiple libraries %s)r   rN   r   r   rŠ   Úprint)r%   rF   r}   rH   Úfail_on_errorZlibnamesrJ   r/   r/   r0   Úreport_duplicate=  s    r¬   c                 C   s¶   t | |tƒ ƒ}t| |dd}i }|D ]@}|| d D ].}|dkrBq4||vrTtƒ ||< ||  |¡ q4q$|D ]F}t|| ƒdkrj|| D ](}|| jjv r†t| |||| |ƒ  qjq†qjdS )z*check for duplicated symbols in one binaryTry   r   Z_GLOBAL_OFFSET_TABLE_r   N)rP   r   r1   r   r   r   rN   r¬   )r%   rF   r«   rH   ZsymlistÚsymmapÚlibpathr}   r/   r/   r0   Úsymbols_dupcheck_binaryM  s     
r¯   c                 C   sj   | j j}t|ƒ}t|dƒ}t||ƒ |D ]<}|jdkr(tj |j	j
d  |j ¡t ¡ ¡}t|||ƒ q(dS )z5check for symbols defined in two different subsystemsr[   rv   r   N)r   r%   r
   r	   rt   rd   rA   rB   ÚrelpathrS   rT   rU   Úgetcwdr¯   )rŸ   r«   r%   rh   ro   rj   rF   r/   r/   r0   Úsymbols_dupcheckb  s    


"r²   c                 C   s   t | dd dS )zXcheck for symbols defined in two different subsystems (and fail if duplicates are found)T)r«   N)r²   )rŸ   r/   r/   r0   Úsymbols_dupcheck_fatalp  s    r³   c                 C   s”   t jjrh|  d¡ | tddd}| |j_|  d¡ | tddd}| |j_|  d¡ | tddd}| |j_t jj	r|  d¡ | t
ddd}| |j_d	S )
zcheck our dependency listsÚsymbolcheckTzsymbol checking©ÚruleÚalwaysr4   Úsyslibcheckzsyslib checkingúsymbol duplicate checkingz check why a dependency is neededN)r   r£   ZSYMBOLCHECKÚSET_BUILD_GROUPr    r   r%   r¡   r²   r¤   r¨   ©r%   rŸ   r/   r/   r0   ÚSYMBOL_CHECKu  s    



r¼   c                 C   s4   t jjr0| jjr0|  d¡ | tddd}| |j_d S )Nr¸   Tr¹   rµ   )r   r£   ZDUP_SYMBOLCHECKr   Ú	DEVELOPERrº   r³   r%   r»   r/   r/   r0   ÚDUP_SYMBOL_CHECKŒ  s    
r¾   )F)F)+rA   Úrer   Úwaflibr   r   r   r   r   Úwaflib.Logsr   Úsamba_utilsr   r	   r
   r1   r5   r<   Úcompiler=   r@   rM   rP   rY   rr   rt   r~   r‚   r†   r‡   rŒ   r—   r›   r    r¡   r¨   r¬   r¯   r²   r³   r¼   ÚBuildContextr¾   r/   r/   r/   r0   Ú<module>   s>   
B

2B7#(#
