o
    p̦i8                     @   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rd 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rdd Zd'ddZndd  Zd!d" Zd#d Zd$d% Zed&kre  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 )zReturn 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||}|sd S |D ]}	t|	sqt |	  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rt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rddl m} tjdk rt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


$)(
