o
    éT•j¨8  ã                   @   s@  d dl Z d dlZd dlZd dlZe jdkr"dd„ Zdd„ Zdd„ Znoe jd	kr7ejd
kr7d dl	m
Z dd„ ZnZej d¡rDd dlmZ nMe jd	kr‘d dlZd dlZdd„ Zdd„ Zejdkrcdd„ Zndd„ Zej d¡rvdd„ Zdd„ Znejdkr…dd„ Zd'dd„Zndd „ Zd!d"„ Zd#d„ Zd$d%„ Zed&kržeƒ  dS dS )(é    NÚntc                  C   sš   d} t j | ¡}|dkrdS |t| ƒ }t j|d…  dd¡\}}t|dd… ƒd }|dkr3|d7 }t|d	d
… ƒd }|dkrCd}|dkrK|| S dS )zÏReturn the version of MSVC that was used to build Python.

        For Python 2.3 and up, the version number is included in
        sys.version.  For earlier versions, assume the compiler is MSVC 6.
        zMSC v.éÿÿÿÿé   Nú é   éþÿÿÿé   é   é   g      $@r   )ÚsysÚversionÚfindÚlenÚsplitÚint)ÚprefixÚiÚsÚrestÚmajorVersionÚminorVersion© r   ú"/usr/lib/python3.10/ctypes/util.pyÚ_get_build_version	   s   r   c                  C   s^   t ƒ } | du r	dS | dkrd}n| dkrd| d  }ndS ddl}d|jjv r+|d	7 }|d
 S )z%Return the name of the VC runtime dllNr   Úmsvcrtr   zmsvcr%dé
   r   z_d.pydÚdú.dll)r   Úimportlib.machineryÚ	machineryÚEXTENSION_SUFFIXES)r   ÚclibnameÚ	importlibr   r   r   Úfind_msvcrt"   s   r#   c                 C   sx   | dv rt ƒ S tjd  tj¡D ])}tj || ¡}tj |¡r#|  S | ¡  	d¡r+q|d }tj |¡r9|  S qd S )N)ÚcÚmÚPATHr   )
r#   ÚosÚenvironr   ÚpathsepÚpathÚjoinÚisfileÚlowerÚendswith)ÚnameÚ	directoryÚfnamer   r   r   Úfind_library7   s   ÿr2   ÚposixÚdarwin)Ú	dyld_findc              	   C   sH   d|  d|  d| | f g}|D ]} zt | ƒW   S  ty!   Y qw d S )Nzlib%s.dylibz%s.dylibz%s.framework/%s)Ú
_dyld_findÚ
ValueError)r/   Úpossibler   r   r   r2   H   s   
þÿÚaix)r2   c                 C   s@   d}t | dƒ�}| d¡|kW  d  ƒ S 1 sw   Y  dS )z,Return True if the given file is an ELF files   ELFÚbré   N)ÚopenÚread)ÚfilenameÚ
elf_headerÚthefiler   r   r   Ú_is_elf`   s   $ÿrA   c           
      C   sf  t  dt | ¡ ¡}t d¡}|st d¡}|sd S t ¡ }zh|dd|jd|  g}t	t j
ƒ}d|d< d|d	< ztj|tjtj|d
�}W n ty^   Y W z| ¡  W d S  ty]   Y d S w w |� |j ¡ }W d   ƒ n1 sqw   Y  W z| ¡  W n ty†   Y nw z| ¡  W w  ty–   Y w w t ||¡}|s¡d S |D ]}	t|	ƒsªq£t  |	¡  S d S )Nú[^\(\)\s]*lib%s\.[^\(\)\s]*ÚgccÚccz-Wl,-tú-oz-lÚCÚLC_ALLÚLANG©ÚstdoutÚstderrÚenv)r'   ÚfsencodeÚreÚescapeÚshutilÚwhichÚtempfileÚNamedTemporaryFiler/   Údictr(   Ú
subprocessÚPopenÚPIPEÚSTDOUTÚOSErrorÚcloseÚFileNotFoundErrorrJ   r=   ÚfindallrA   Úfsdecode)
r/   ÚexprÚ
c_compilerÚtempÚargsrL   ÚprocÚtraceÚresÚfiler   r   r   Ú_findLib_gccf   s`   



ýýùÿ€ýþýúrf   Úsunos5c                 C   sŽ   | sd S zt jdd| ft jt jd�}W n
 ty   Y d S w |� |j ¡ }W d   ƒ n1 s0w   Y  t d|¡}|s?d S t	 
| d¡¡S )Nz/usr/ccs/bin/dumpz-Lpv©rJ   rK   s   \[.*\]\sSONAME\s+([^\s]+)r   )rU   rV   rW   ÚDEVNULLrY   rJ   r=   rN   Úsearchr'   r]   Úgroup)Úfrb   Údatard   r   r   r   Ú_get_sonameš   s"   
þÿÿrn   c                 C   s¤   | sd S t  d¡}|sd S ztj|ddd| ftjtjd�}W n
 ty(   Y d S w |� |j ¡ }W d   ƒ n1 s;w   Y  t	 
d|¡}|sJd S t | d¡¡S )NÚobjdumpú-pz-jz.dynamicrh   s   \sSONAME\s+([^\s]+)r   )rP   rQ   rU   rV   rW   ri   rY   rJ   r=   rN   rj   r'   r]   rk   )rl   ro   rb   Údumprd   r   r   r   rn   «   s(   

þÿÿ)ÚfreebsdÚopenbsdÚ	dragonflyc                 C   sN   |   d¡}g }z|r| dt| ¡ ƒ¡ |s
W n	 ty    Y nw |p&tjgS )Nó   .r   )r   Úinsertr   Úpopr7   r   Úmaxsize)ÚlibnameÚpartsÚnumsr   r   r   Ú_num_versionÃ   s   
ÿ€ÿr|   c                 C   s´   t  | ¡}d||f }t |¡}ztjdtjtjd�}W n ty'   d}Y nw |� |j	 
¡ }W d   ƒ n1 s:w   Y  t  ||¡}|sMtt| ƒƒS |jtd� t |d ¡S )Nz:-l%s\.\S+ => \S*/(lib%s\.\S+))ú/sbin/ldconfigz-rrh   ó    )Úkeyr   )rN   rO   r'   rM   rU   rV   rW   ri   rY   rJ   r=   r\   rn   rf   Úsortr|   r]   )r/   Úenamer^   rb   rm   rd   r   r   r   r2   Î   s&   


þÿÿc           	      C   sú   t j d¡sd S tt jƒ}d|d< |rd}nd}d }ztj|tjtj|d�}W n
 t	y1   Y d S w |�  |j
D ]}| ¡ }| d¡rLt  |¡ ¡ d }q8W d   ƒ n1 sWw   Y  |s`d S | d	¡D ]}t j |d
|  ¡}t j |¡rz|  S qed S )Nú/usr/bin/crlerF   rG   )r‚   ú-64)r‚   rI   s   Default Library Path (ELF):r;   ú:zlib%s.so)r'   r*   ÚexistsrT   r(   rU   rV   rW   ri   rY   rJ   ÚstripÚ
startswithr]   r   r+   )	r/   Úis64rL   ra   Úpathsrb   ÚlineÚdirÚlibfiler   r   r   Ú_findLib_crleå   sB   

ýÿ

€ýÿÿr�   Fc                 C   s   t t| |ƒp	t| ƒƒS ©N)rn   r�   rf   )r/   rˆ   r   r   r   r2   	  s   c           	      C   s  dd l }t ¡ }|j d¡rd}| d¡dkr|jd }n|jd }ddddd	d
dœ}| |d¡}d}t |t 	| ¡|f ¡}zBt
jddgt
jt
jt
jdddœd��%}t ||j ¡ ¡}|rnt | d¡¡W  d   ƒ W S W d   ƒ W d S 1 szw   Y  W d S  ty‹   Y d S w )Nr   ÚarmÚlr;   z-32rƒ   zlibc6,x86-64zlibc6,64bitzlibc6,IA-64zlibc6(,hard-float)?)z	x86_64-64zppc64-64z
sparc64-64zs390x-64zia64-64zarm-32Úlibc6z\s+(lib%s\.[^\s]+)\s+\(%sr}   rp   rF   )rG   rH   )ÚstdinrK   rJ   rL   r   )Ústructr'   ÚunameÚmachiner‡   ÚcalcsizeÚgetrM   rN   rO   rU   rV   ri   rW   rj   rJ   r=   r]   rk   rY   )	r/   r“   r”   r•   Úmach_mapÚabi_typeÚregexÚprd   r   r   r   Ú_findSoname_ldconfig  sD   
ø

üù&úÿrœ   c                 C   sÐ   dt  | ¡ }ddg}tj d¡}|r"| d¡D ]	}| d|g¡ q| dtjd|  g¡ d }z.tj	|tj
tj
d	d
�}| ¡ \}}t  |t |¡¡}	|	D ]}
t|
ƒsSqLt |
¡  W S W |S  tyg   Y |S w )NrB   Úldz-tÚLD_LIBRARY_PATHr„   z-LrE   z-l%sT)rJ   rK   Úuniversal_newlines)rN   rO   r'   r(   r—   r   ÚextendÚdevnullrU   rV   rW   Úcommunicater\   r]   rA   Ú	Exception)r/   r^   ÚcmdÚlibpathr   Úresultr›   ÚoutÚ_rd   re   r   r   r   Ú_findLib_ld7  s2   
þú	þþr©   c                 C   s    t | ƒptt| ƒƒptt| ƒƒS rŽ   )rœ   rn   rf   r©   )r/   r   r   r   r2   R  s
   
ÿ
ÿc                  C   sÈ  ddl m}  tjdkrt| jƒ t|  d¡ƒ ttdƒƒ tjdkrâttdƒƒ ttdƒƒ ttdƒƒ tj	d	krWt|  
d
¡ƒ t|  
d¡ƒ t|  
d¡ƒ t|  
d¡ƒ d S tj	 d¡rÌddl m} tjdk r‹td|dtjƒ› �ƒ td|  
d¡› �ƒ ttdƒƒ t|  
d¡ƒ ntd|dtjƒ› �ƒ td|  
d¡› �ƒ tdtdƒ› �ƒ td|  
tdƒ¡› �ƒ tdtdƒ› �ƒ td|  
tdƒ¡› �ƒ d S t|  
d¡ƒ t|  
d¡ƒ ttdƒƒ d S d S )Nr   )Úcdllr   r   r3   r%   r$   Úbz2r4   z
libm.dylibzlibcrypto.dylibzlibSystem.dylibzSystem.framework/Systemr9   )ÚCDLLl        z"Using CDLL(name, os.RTLD_MEMBER): zlibc.a(shr.o)zUsing cdll.LoadLibrary(): Úrpmz	librpm.sozlibc.a(shr_64.o)z	crypt	:: Úcryptz
crypto	:: Úcryptozlibm.sozlibcrypt.so)Úctypesrª   r'   r/   Úprintr   Úloadr2   r   ÚplatformÚLoadLibraryr‡   r¬   rx   ÚRTLD_MEMBER)rª   r¬   r   r   r   ÚtestZ  s>   




ár¶   Ú__main__)F)r'   rP   rU   r   r/   r   r#   r2   r³   Úctypes.macholib.dyldr5   r6   r‡   Úctypes._aixrN   rR   rA   rf   rn   r|   r�   rœ   r©   r¶   Ú__name__r   r   r   r   Ú<module>   sB    




2


$)(
ÿ