
    xhe                    2   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mZ d dl	m	Z	 d dl
mZ d dlmZ d dlmZmZ dd	lmZmZmZ d
dlmZ d
dlmZmZmZmZ d
dlmZ 	 d dlZej                                          dZ!n# e"$ r dZ!Y nw xY wdFdZ#d Z$e!r	 dGdHdZ%nd
dlm%Z% d Z&d Z'd Z(d  Z)e!r>d! Z* ee*d"ej+        j,        j-        #          Z. ee*d$ej+        j,        j/        #          Z0nd% Z.d& Z0d' Z1d( Z2dId*Z3dJd,Z4d- Z5d. Z6d/ Z7d0 Z8d)g d)dfd1Z9	 	 	 	 	 dKd2Z:	 	 	 	 	 dKd3Z;dLd4Z<d5 Z=d Z>d6 Z?d7 Z@d8 ZAd9 ZBd: ZCd; ZDdMd<ZEdLd=ZFdNd>ZG G d? d@          ZHeHdMdA            ZIeHdLdB            ZJeHdLdC            ZKeHdD             ZLeH	 dOdE            ZMdS )P    )annotationsN)Hashable)fnmatch)partial)Path)PIPEPopen   )on_macon_winrec_glob   )find_executable)DLLfileEXEfileelffile	machofile)inspect_linkagesTFfile-str | os.PathLike | Path | lief.Binary | Nonereturnlief.Binary | Nonec                   t          | t          j                  r| S | r!t          |                                           sd S 	 t          j        t          |                     S # t          $ r t          d|  d           Y d S w xY w)Nz*WARNING: liefldd: failed to ensure_binary())	
isinstanceliefBinaryr   existsparsestrBaseExceptionprintr   s    <lib/python3.11/site-packages/conda_build/os_utils/liefldd.pyensure_binaryr%   '   s     $$$  d**,, tz#d))$$$   B4BBBCCCtts    A$ $BBc                   d}	 t          j        |           }|j        }t          |          dk    r2|D ]/}t	          t          |                     t	          |           d}0n#  Y nxY w|st	          d           dS dS )z%Return symbols from *filename* binaryFr   TzNo symbols foundN)r   r   symbolslenr"   dir)filenamedonebinaryr'   symbols        r$   nmr.   5   s    D
H%%.w<<!!  c&kk"""f " !!!!!" "s   A A% %A)pathstr | os.PathLike | Pathskip_symlinksbool4type[DLLfile | EXEfile | machofile | elffile] | Nonec                x   t          |           x}sd S |j        t          j        j        k    r)t          j        j        j        |j        j        v rt          S |j        t          j        j        k    rt          S |j        t          j        j        k    rt          S |j        t          j        j        k    rt          S d S N)r%   formatr   EXE_FORMATSPEHEADER_CHARACTERISTICSDLLheadercharacteristics_listr   r   MACHOr   ELFr   )r/   r1   r,   s      r$   codefile_classr?   I   s    
 (--- 	4MT-000.2fm6XXXN]d.111N]d.444]d.222N4    )r?   c                    |                      d          s|                      d          r4| d d         } |                      d          |                      d          4| S )N/\)endswith)sysroots    r$   _trim_sysrootrG   b   sl    


3

 7#3#3D#9#9 #2#, 

3

 7#3#3D#9#9 Nr@   c                @   g }t          |           rj        t          j        j        k    rj        }nfd j        D             }d j        t          j        j        k    r9d j        D             t                    rd         nd fd|D             }|S )Nc                J    g | ] }t          |t                    r|n|j        !S  )r   r    name).0libs     r$   
<listcomp>z!get_libraries.<locals>.<listcomp>o   s:       >Az#s++9  r@   c                Z    g | ](}|j         t          j        j        j        k    !|j        )S rJ   )commandr   MachOLOAD_COMMAND_TYPESID_DYLIBrK   rL   rP   s     r$   rN   z!get_libraries.<locals>.<listcomp>u   s9       $**G*PPP LPPPr@   r   c                L    g | ] }r|k    
t          j        d |          !S r5   )from_os_varnamesr6   )rL   rM   r,   binary_names     r$   rN   z!get_libraries.<locals>.<listcomp>{   sF       & +.*<*< %V]D#>>*<*<*<r@   )	r%   r6   r   r7   r8   	librariesr=   commandsr(   )r   resultr,   rW   s     @@r$   get_librariesr[   h   s    F4  F =D,///%FF EKEU  F K} 0 666 #)?  
 14K0@0@Jk!nnd    %  
 Mr@   c                    | j         }fd|D             }g }|D ]*}|                    |                    d                     +|S )Nc                F    g | ]}|j         k    t          |          S rJ   )taggetattr)rL   e	attributedyn_tags     r$   rN   z)_get_elf_rpathy_thing.<locals>.<listcomp>   s0    XXXqquPWGWGWWQ	**GWGWGWr@   :)dynamic_entriesextendsplit)r,   ra   rb   rd   rpaths_colonsrpathsrpaths    ``    r$   _get_elf_rpathy_thingrj      sb    ,OXXXXXOXXXMF ( (ekk#&&''''Mr@   c                L   | j         }d}|D ]}|rI|j        t          j        j        j        k    r*t          |j        |          r|j        |k    r
||_        d}M|rH|j        t          j        j        j        k    r)t          |j	        |          r|j	        |k    r	||_	        d}|S )NFT)
rd   r^   r   r>   DYNAMIC_TAGSRUNPATHr   runpathRPATHri   )r,   old_matching	new_rpath	set_rpathset_runpathrd   changedr`   s           r$   _set_elf_rpathy_thingru      s    ,OG  	.666	<00 7	Y&&!AIGG	.444.. 59$$AGGNr@   c                   d}d}t          |           }g }|r|j        }|t          j        j        k    rM|j        }|t          j        j        j        k    s|t          j        j        j        k    rt          |||          }nZ|t          j        j
        k    rE|j        r>|t          j        j        j        k    r$|                    d |j        D                        |||fS )z
        By raw we mean that no processing is done on them whatsoever. The values are taken directly from
        LIEF. For anything but Linux, this means an empty list.
        Nc                Z    g | ](}|j         t          j        j        j        k    !|j        )S rJ   )rP   r   rQ   rR   ro   r/   rT   s     r$   rN   z0get_rpathy_thing_raw_partial.<locals>.<listcomp>   s9       #"?dj.K.QQQ  QQQr@   )r%   r6   r   r7   r>   type	ELF_CLASSCLASS32CLASS64rj   r=   	has_rpathrl   ro   re   rY   )r   elf_attributeelf_dyn_tagbinary_formatbinary_typer,   rh   s          r$   get_rpathy_thing_raw_partialr      s     t$$ 	"MM 0 444$k48#5#==="dh&8&@@@26=+VVF!1!777$ 848#8#>>> '-     }k11r@   rn   )r}   r~   ri   c                    g d d fS r5   rJ   r#   s    r$   get_runpaths_rawr          4~r@   c                    g d d fS r5   rJ   r#   s    r$   get_rpaths_rawr      r   r@   c                    t          |           \  }}}t          |          st          |           \  }}}d}nd}||||fS )z]
    Can be called on all OSes. On linux, if runpaths are present they are
    returned.
    rh   runpaths)r   r(   r   )r   rh   r   r   _rpaths_types         r$   get_runpaths_or_rpaths_rawr      sT    
 *:$)?)?&FM;v;; !%d++1 ;{::r@   c                :   t          |          }|sd S |j        t          j        j        k    ri|j        t          j        j        j        k    s|j        t          j        j        j        k    r/t          || |dd          r|
                    |           d S d S d S d S )NTF)rr   rs   )r%   r6   r   r7   r>   rx   ry   rz   r{   ru   write)rp   rq   r   r,   s       r$   rr   rr      s    4  F }(,,,tx)111;$(,444 L)t
 
 
 	 LL -,	 	 54r@    c                J   t          |           \  }}t          j        j        k    r|r)|                    |                    dd                     |rj|                    d                    |df                     |                    d                    |ddf                     |                    |           |r/|                    t          t          |                               n!t          j        j
        k    rd |D             }fd|D             S )NrC   rB   System32	downlevelc                8    g | ]}|                     d           S )rB   )rstrip)rL   ri   s     r$   rN   zget_rpaths.<locals>.<listcomp>	  s$    888%,,s##888r@   c                2    g | ]}t          |          S rJ   )rV   )rL   ri   r   r   s     r$   rN   zget_rpaths.<locals>.<listcomp>
  s&    TTTE]K??TTTr@   )r   r   r7   r8   appendreplacejoinre   list_get_path_dirsr=   )r   exe_dirnameenvrootwindows_rootrh   r   r   r   s         @@r$   
get_rpathsr      s&   6PQU6V6V3FK(+++  	:MM+--dC88999 	(MM#((L*#=>>???MM#((L*k#JKKLLLMM,''' 	9MM$~g6677888	$*0	0	088888TTTTTVTTTTr@   nativec                D   t           j                            |           sdg g fS t          |          }	 t	          j        |           }t          j        t	          j        |                    }|r| |d         |d         fS n#  t          d|  d           Y nxY wdg g fS )zM

    :param filename:
    :param sysroot:
    :param arch:
    :return:
    Nimported_librariesz0WARNING: liefldd: failed _inspect_linkages_this(r   )
osr/   r   rG   r   r   jsonloadsto_jsonr"   )r*   rF   archr,   	json_datas        r$   _inspect_linkages_thisr     s     7>>(## R|G$$GNH%% Jt|F3344	 	././ 	NLLLLMMMMMR<s   AB Bc                r   | j         t          j        j        k    r>|                    dd                              dd                              dd          S | j         t          j        j        k    rD| j        j        dk    rd}nd	}t                              dd
                              |d          S dS )LDon't make these functions - they are methods to match the API for elffiles.$SELFDIR@loader_path$EXEDIR@executable_path$RPATH@rpath   /lib64/lib$ORIGIN$LIBN)	r6   r   r7   r=   r   r>   ehdrsz_ptrinput)r,   input_libdirs      r$   to_os_varnamesr   ,  s    }(...NN:~66WY 233WXx((	

 
$*.	.	.;""FFF}}Z33;;FFKKK 
/	.r@   c                   | t           j        j        k    r>|                    dd                              dd                              dd          S | t           j        j        k    rI|t           j        j        j        k    rd}nd}|                    d	d                              d
|          S | t           j        j        k    r|S dS )r   r   r   r   r   r   r   r   r   r   r   N)r   r7   r=   r   r>   ry   r{   r8   )r   r   r   r   s       r$   rV   rV   <  s    (...NN>:66W'33WXx((	

 
$*.	.	.$(,444FFF~~i44<<VVLLL	$*-	-	- 
.	-r@   c              #  >  K   d                     | f          V  d                     | dddf          V  d                     | dddf          V  d                     | ddf          V  d                     | df          V  d                     | df          V  d S )NrB   Libraryz	mingw-w64binusrScripts)r   )prefixs    r$   r   r   O  s      
((F9


((FI{E:
;
;;;;
((FIue4
5
5555
((FIu-
.
....
((FI&
'
''''
((FE?
#
######r@   c                   t          |           }|st          j        j        S |j        t          j        j        k    r|j        S |j        t          j        j        k    rb|j        t          j        j	        j
        k    s|j        t          j        j	        j        k    r$|j        }d |D             }|r|d         S |j        S |j        S )Nc                Z    g | ](}|j         t          j        j        j        k    !|j        )S rJ   )r^   r   r>   rl   SONAMErK   rL   r`   s     r$   rN   z&get_uniqueness_key.<locals>.<listcomp>c  s5     
 
 
qu8M8T/T/TAF/T/T/Tr@   r   )r%   r   r7   UNKNOWNr6   r=   rK   r>   rx   ry   rz   r{   rd   )r   r,   rd   rZ   s       r$   get_uniqueness_keyr   X  s    4  F ''	$*0	0	0{	$*.	.	.tx)111;$(,444 0
 
+
 
 
  	!9{;r@   c	                :   d}	d}
|sg n|                     d          }                    d          r|r|gn||z   fd|D             z   }|D ]}                    d|                              d|                              d|          }t          j                            |          }|oo|                              }|s|s|r|}	d}
 n|
sddfS nt          fd	d
D                       rc                    d|                              d|          }t          j                            |          }|oo|                              }n=                    d          rddfS t          j                            |          ddfS ||	|fS )a  
    From `man ld.so`

    When resolving shared object dependencies, the dynamic linker first inspects each dependency
    string to see if it contains a slash (this can occur if a shared object pathname containing
    slashes was specified at link time).  If a slash is found, then the dependency string is
    interpreted as a (relative or absolute) pathname, and the shared object is loaded using that
    pathname.

    If a shared object dependency does not contain a slash, then it is searched for in the
    following order:

    o Using the directories specified in the DT_RPATH dynamic section attribute of the binary
      if present and DT_RUNPATH attribute does not exist.  Use of DT_RPATH is deprecated.

    o Using the environment variable LD_LIBRARY_PATH (unless the executable is being run in
      secure-execution mode; see below).  in which case it is ignored.

    o Using the directories specified in the DT_RUNPATH dynamic section attribute of the
      binary if present. Such directories are searched only to find those objects required
      by DT_NEEDED (direct dependencies) entries and do not apply to those objects' children,
      which must themselves have their own DT_RUNPATH entries. This is unlike DT_RPATH,
      which is applied to searches for all children in the dependency tree.

    o From the cache file /etc/ld.so.cache, which contains a compiled list of candidate
      shared objects previously found in the augmented library path. If, however, the binary
      was linked with the -z nodeflib linker option, shared objects in the default paths are
      skipped. Shared objects installed in hardware capability directories (see below) are
      preferred to other shared objects.

    o In the default path /lib, and then /usr/lib. (On some 64-bit architectures, the default
      paths for 64-bit shared objects are /lib64, and then /usr/lib64.)  If the binary was
      linked with the -z nodeflib linker option, this step is skipped.

    Returns a tuple of resolved location, rpath_used, in_sysroot
    NFrc   r   c                <    g | ]}|                     d           S )z$SYSROOT)r   )rL   dprF   s     r$   rN   z*_get_resolved_location.<locals>.<listcomp>  s'    GGG2rzz*g..GGGr@   r   r   Tc              3      K   | ]}|v V  	d S r5   rJ   )rL   a
unresolveds     r$   	<genexpr>z)_get_resolved_location.<locals>.<genexpr>  s'      >>Q*_>>>>>>r@   )r   r   rB   )rf   
startswithr   r   r/   r   anyr   )codefiler   exedirselfdirrpaths_transitiveLD_LIBRARY_PATHdefault_pathsrF   resolved_rpathrpath_resultfoundld_library_pathsthese_rpathsri   resolvedr   exists_sysroots    `     `         r$   _get_resolved_locationr   l  s   ^ LE!0Prro6K6KC6P6PX&& B H^"GGGGGGGH 	 " 	 	E""8U33W--F++ 
 W^^H--F#PPH4G4G4P4PN  > $  	+tU**	+ 
>>>>&=>>>	>	> B%%j'::BB9fUU))LGL0C0CG0L0L  %% 	BtU**7<<44dEAA\>11r@   c                   t                      }t          j                            |           }t	          j        |           | gg}t          |          }g }	sg }	nj        t          j        j	        k    r)j
        t          j	        j        j        k    rg d}	nAddg}	n<j        t          j        j        k    rdg}	nj        t          j        j        k    rddg}	i }
t                      }t          | d i          }|r|D ]}|                    d           |d         }|d         s+t#                    }||vrDd }j        t          j        j        k    rJ|}|rE|s9t%          |d	          t&          k    rt          j                            |          }||         }|En|}d
|v st          j        dz   t          j        z   |v r#|                    t          j        d          dz   }t-          ||                    t          j        d          |          ||<   |}g }j        t          j        j        k    r	||         }n|r||         |d d<   ||         }|t/                    }||v r|                    |           fd|D             }t3          ||          D ]\  }}t5          |||||	|          }t          j                            |d                   }	 |r|||d}n||d}||
|<   |||d         <   |rZt          j                            |d                   r5|                    |d         t	          j        |d                   g           |                    t#                               ||
S )N)z$SYSROOT/lib64z$SYSROOT/usr/lib64$SYSROOT/lib$SYSROOT/usr/libr   r   z$SYSROOT/System32/Wbemz($SYSROOT/System32/WindowsPowerShell/v1.0r   r   Tr1   z.pydDLLsrB   z/DLLsc                    g | ]M}|                     d           s4|                     d          sj        t          j        j        k    rd|z   n|NS )rB   $z$RPATH/)r   r6   r   r7   r=   )rL   rM   r,   s     r$   rN   z)inspect_linkages_lief.<locals>.<listcomp>  su     	 	 	   #~~c22! #s 3 3! #MT-=-CCC "C !	 	 	r@   )r   r   rF   )origr   rh   )r   rh   )setr   r/   dirnamer   r   rG   r6   r7   r>   rx   ry   r{   r=   r8   dictpopr   r?   r   sepr   r   r[   removezipr   normpathr   r   add)r*   resolve_filenamesrecurserF   r   r   already_seenr   todor   resultsrpaths_by_binaryparents_by_filenameelement	filename2uniqueness_keyparent_exe_dirnametmp_filenamer   rX   
these_origrM   r   r   
path_fixedrecr,   s                             @r$   inspect_linkages_liefr     sB    55LW__X&&FZ!!FvDG$$GM 
	$*.	.	.;$(,444  MM ,-?@MM	$*0	0	0+,	$*-	-	- %6
 Gvv$/00
 _= ^	= ^	=GHHQKKK
IQZF /77N\11%)"=D$4$777#,L& I 2O .|4 P P P&!' !' 241N1N.':<'H ' I *0&Y&&26F?RV+C	*Q*Q)0)E)E)O&.8.0L0Lg/ / +  )$&!=D$4$777(8(F%%& I0@0N)"1"-':<'H ' I *&11		))$$Y///	 	 	 	  )	 	 	
 "%Y
!;!; ,P ,PIC5*;&3 '     H "$!1!1(1+!>!>J  ) J$((2&7  (,7HII#&GCL7@'4 P7>>(1+66 P KK!dj!6M6M(NOOO  !3F!;!;<<<  _=@ Nr@   c                   g }d}t           r|rVt          | d          }|t          t          fvrt	          | ||||          }t           s|S nt          d|  d|            i S t          | |||||          }	|rJ|rHt          |	          t          |          k    r(t          d| d	|d
|d|d|d|d|	 d| d           |	S )NFTr   )r   r   rF   r   z1WARNING: failed to get_linkages, codefile_class('z	', True)=r   r   rF   r   r   z/WARNING: Disagreement in get_linkages(filename=z, resolve_filenames=z
, recurse=z
, sysroot=z
, envroot=z, arch=z
):
 lief: z
pyldd: z
  (using lief))	have_liefr?   r   r   inspect_linkages_pylddr"   r   r   )
r*   r   r   rF   r   r   result_pyldddebugr   result_liefs
             r$   get_linkagesr  O  s    LE  !($???GW---1"3  L  $##$ aHaaW_aa   I'+  K  
 
#k"2"2c,6G6G"G"GX    %, 18 =D IM !  #  	
 	
 	
 r@   c                B    t          |           }d |j        D             S )Nc                ,    g | ]}t          |          S rJ   r    )rL   is     r$   rN   zget_imports.<locals>.<listcomp>  s    666qCFF666r@   )r%   imported_functions)r   r   r,   s      r$   get_importsr    s&    4  F66F56666r@   c                    	 t          | d          5 }d}|                    d          }t          j        d||d                   \  }|dfcd d d            S # 1 swxY w Y   d S #  Y dS xY w)Nrbr   r   z<8s)r   r   )openreadstructunpack)r   findexcontent	signatures        r$   _get_archive_signaturer    s    $ 	 EffQiiG!=a0@AALYa<		  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 
uus.   A& :AA& AA&  A!A& &A+c                :    t          |           \  }}|dk    rdndS )N   !<arch>
TF)r  )r   r  r   s      r$   
is_archiver    s'    )$//LIq,,44%7r@   c                t   d }g }t          |           \  }}|dk    rt          d|  d           |S t          | d          5 }t          rt          d|             d}|                                }||z  }t                      }t                      }	g }
|dz  r|dz  }t          rt          d	t          |                       |||          \  }}}}}|d
k    rOt          j        d|||dz                      \  }g }t          |          D ]K}t          j        d||dz   |dz  z   |dz   |dz   dz  z                      \  }|
                    |           Ld ||dz   |dz  z   ||z                                d          d |         D             }t          |          D ]} ||||                   \  }}}}}|                    |           |	                    ||                    t          r2t          d||          d||          d| d|||dz                        nz|                    d          rdd|v rd}d}nd}d}t          j        |          dz  }t          j        |          }t          j        d|z   ||||z                      \  }|dz  }t          j        d|z   |||z   ||z  z   |dz   dz   ||z  z                      \  }g }||dz  z   }t          |          D ]N}t          j        d|z   |z   ||||z  z   ||dz   |z  z                      \  }}|
                    ||f           Ot          dk    rLt          d                    t          |||z  z             t          |||z  z   |z                                  ||||z  z   |||z  z   |z            }|                    dd          }g }t          |          D ]}||         } | \  }!}"||!|!||!d                              d          z            }#|
                    |#           t          dk    r7t          ||          dt          |!           d t          |"                       |||"          \  }$}}}}|                    |$           |	                    |"           |	                    t%          |                     t'          t)          |                    }t'          t)          |	                    dd          }	t          dk    r?t          d!                    d"                    d# |D                                            t          dk    r?t          d$                    d"                    d% |	D                                            t-          ||	          D ]W\  }%}&d&}'d'}(t          j        d(||%|%dz                      \  })t          dk    r.t          t          |%          t          |&          |&|%z
             |)|'|(fv rQ	 t.          j                            ||%|&dz
           )          }*np#  t          dk    rt          d*           	 d }*Y nOxY w|)d+k    rt/          j        ||%|&         )          }*n(t.          j                            ||%|&         )          }*|*s(|d, |D             |d- |D             fc cd d d            S |
                    t9          |*d.d/0                     Y|
d1 |
D             |
d2 |
D             fcd d d            S # 1 swxY w Y   d S )3Nc                   d}t          j        |          }t          j        || |||z                      \  }}}}}}	}
	 t          |	          }	n##  t	          d| d|	            |ddddfcY S xY wd}|                    d          rvd}t          |d	d
                   }t          j        dt          |          z   dz   | ||z   ||z   |z                      \  }d|v r|d
|                    d                   }nM|                    d          rd}n5|                                dk    rd}n|                    d          rd}nd}d|v r|d
|                    d                   }|||z   z  }||||	|fS )a  
        0   16  File identifier                 ASCII
        16  12 	File modification timestamp     Decimal
        28  6   Owner ID                        Decimal
        34  6   Group ID                        Decimal
        40  8   File mode                       Octal
        48  10  File size in bytes              Decimal
        58  2   Ending characters               0x60 0x0A
        z<16s 12s 6s 6s 8s 10s 2sERROR: z has non-integral size of r   r   INVALIDs   #1/BSD   N<s    s   //	GNU_TABLE   /GNU_SYMBOLSGNUNORMAL)	r  calcsizer  intr"   r   r    findstrip)r  r  
header_fmt	header_szrK   modifiedownergroupmodesizeendingname_lentyps                r$   _parse_ar_hdrz-get_static_lib_exports.<locals>._parse_ar_hdr  s    0
OJ//	;A=	(9 9:<
 <
8hudD&	.t99DD	.BDBBDBBCCC"aI---- 	 ??6"" 	C48}}Hmc(mm#c)	)EI,=,HHI GT $0dii0001__U## 	CCZZ\\T!!CC__T"" 	CCC4<<)$))D//)*D 	X%%dHdC//s    A A0r  r  z is not an archiver  zArchive file r   r   zar_hdr index = r'  z>I   c                8    g | ]}|                     d           S )utf-8)decode)rL   symnames     r$   rN   z*get_static_lib_exports.<locals>.<listcomp>  s4        w''  r@   r$  zsymname z	, offset z, name z, elf? s	   __.SYMDEFs   64QIr
   r"  r   zstring_table: start: {} end: {}r;  ignore)errors z	 :: strx=z, off=zobj_starts: {} c              3  "   K   | ]
}d |dV  dS 0x05xNrJ   rL   os     r$   r   z)get_static_lib_exports.<locals>.<genexpr>G  s*      2T2TA<<<<2T2T2T2T2T2Tr@   z  obj_ends: {}c              3  "   K   | ]
}d |dV  dS rE  rJ   rH  s     r$   r   z)get_static_lib_exports.<locals>.<genexpr>I  s*      2R2RA<<<<2R2R2R2R2R2Rr@   iL  id  z<H)rawzFget_static_lib_exports failed, PECOFF not supported by LIEF nor pyldd.i  c                    g | ]}d d gS r   rJ   rL   syms     r$   rN   z*get_static_lib_exports.<locals>.<listcomp>i  s    555q!f555r@   c                    g | ]}d d gS rM  rJ   rN  s     r$   rN   z*get_static_lib_exports.<locals>.<listcomp>i  s    =U=U=Uq!f=U=U=Ur@   TF)defined	undefinedc                    g | ]}d d gS rM  rJ   rN  s     r$   rN   z*get_static_lib_exports.<locals>.<listcomp>u      )))aV)))r@   c                    g | ]}d d gS rM  rJ   rN  s     r$   rN   z*get_static_lib_exports.<locals>.<listcomp>w  rT  r@   )r  r"   r  debug_static_archivesr  r   hexr  r  ranger   rf   r   r   r*  r6   r<  r,  r(   sortedr   r   r   r   r8   r   r>   re   get_symbols)+r   r8  r   r  len_signaturer  r  r  
obj_startsobj_ends	functionsrK   r6  r4  r7  nsymbolsoffsetsr  offsetsymsindex2ranlib_struct_field_fmttoc_integers_fmtranlib_struct_sztoc_integers_szsize_ranlib_structssize_string_tableranlib_structsranlib_indexran_offran_strxstring_tableranlib_structstrxoffrO  off2	obj_startobj_endIMAGE_FILE_MACHINE_I386IMAGE_FILE_MACHINE_AMD64MACHINE_TYPEobjs+                                              r$   get_static_lib_exportsry    sN	   .0 .0 .0` G5d;;I}L  0000111	dD		 f
Q  	*($(()))&&((UU
55	19 	QJE  	20CJJ00111+8=%+H+H(tXtS- !-geeai6G.HIIKX G8__ ' '"M'%!)a!e"3eai1q5A+6M"MN 	 v&&&& &uqyHqL'AEDL'PQWW   8)   D 8__  4AM'7ST:4V4V1hcv&&&WQZ(((( q47qqWQZqqqqU\]cdjmndn]nUoqq   __\** H	" }}*-'#&   +.'#& %/FGG!K$o.>??O%+]&&8O0O(P& &"  +a/H#)=&&O+x:J/JKeOO  "22O4 4$ $   N Oa$78L8__ ; ;$*M114KK$,<(<=E%55A7 7% %! %%x&9::::$q((5<<LH7G,GHII('*::</0  	 	 	 #+; ;<|..@0#@$ $L
 (..wx.HHLD8__ 
" 
" .q 1)	c"4$dee1D1I1I&1Q1Q*Q#QRC   (1,,T!WJJs4yyJJCJJKKK2?-2M2M/dHdCt$$$S!!!!S\\"""D,,--
$x..))!""- 1$$"))#((2T2T2T2T2T*T*TUUVVV 1$$"))#((2R2R2R2R2R*R*RSSTTT"%j(";"; (	N (	NIw&,#'-$$mD')iRSm:S2TUUO\$q((c)nnc'llGi4GHHH 79QRRR'--GI!4K,L-MMCC,q00d   CCC''jWYw->%?@@@ hnn71B)CnDD V55555t=U=UPT=U=U=UUUUof
 f
 f
 f
 f
 f
 f
 f
@ [deLLLMMMM))y)))))y)))	
Cf
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
 f
s3   W\-+Y\-Y'%A.\- A \--\14\1c                    g g g g fS r5   rJ   r#   s    r$   get_static_lib_exports_noper{  {  s    r2r>r@   c                   t          d          }t          r|sd}|rt          j                            |          sd S d}t
          rd}	 t          ||| gdt                                                    \  }}|	                    d          
                    dd	                                          }d
 |D             }|                                 n%# t          $ r t          d|  d           d }Y nw xY w|S )Nr.   zC:\msys64\mingw64\bin\nm.exez-Pgz-PgUjFshellstdoutr;  z

c                v    g | ]6}d |v |                     d          |                    d          d         7S )z T z.text rC  r   r   rf   rL   rs     r$   rN   z-get_static_lib_exports_nm.<locals>.<listcomp>  sG     
 
 
zz!,,x"8"8z GGCLLOzzr@   #WARNING: nm: failed to get_exports(r   )r   r   r   r/   r   r   r	   r   communicater<  r   
splitlinessortOSErrorr"   )r*   nm_exeflagsoutr   r   s         r$   get_static_lib_exports_nmr    s3   T""F 4f 43 // tE UH%U4
 
 

+-- 	Q **W%%--fd;;FFHH
 

 
 

 	    	?H???@@@	
 Ns   
B
C C76C7c                T   t          d          }|s(	 t          j        d         }d t          j        |          D             }g }|D ]}t	          t          j                            ||          d          }|D ]}	 t          || gdt                    	                                \  }}	|
                    d                                          }
|
d                             d	          d
         }|                    ||f           #  Y xY wddlm t!          |fd          }|d
         d         }|sdS dg}g }dD ]}	 t          |g|z   |gz   | gz   dt                    	                                \  }}	|
                    d                                          }|dk    r |                    d |D                        n|                    d |D                        # t$          $ r t'          d|  d           d}Y w xY w|                                 |S )aZ  
    > dumpbin /SYMBOLS /NOLOGO C:\msys64\mingw64\lib\libasprintf.a
    > C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\bin\Hostx64\x64\dumpbin.exe
    > 020 00000000 UNDEF  notype ()    External     | malloc
    > vs
    > 004 00000010 SECT1  notype ()    External     | _ZN3gnu11autosprintfC1EPKcz
    dumpbinzPROGRAMFILES(X86)c                <    g | ]}|                     d           |S )zMicrosoft Visual Studio)r   )rL   ps     r$   rN   z2get_static_lib_exports_dumpbin.<locals>.<listcomp>  s:     
 
 
ALL9R,S,S

 
 
r@   )zdumpbin.exeFr}  r;  r   rC  rD   r
   )VersionOrderc                &     | d                   S )Nr   rJ   )xr  s    r$   <lambda>z0get_static_lib_exports_dumpbin.<locals>.<lambda>  s    QqT0B0B r@   )keyNz/NOLOGO)z/SYMBOLS/EXPORTSr  c                n    g | ]2}|                     d           |                    d          d         3S )z                  rC  rD   r  r  s     r$   rN   z2get_static_lib_exports_dumpbin.<locals>.<listcomp>  sJ       <<(<==R(  r@   c                T    g | ]%}d |v d|v
|                     d          d         &S )z	External zUNDEF rC  rD   )rf   r  s     r$   rN   z2get_static_lib_exports_dumpbin.<locals>.<listcomp>  sF       '1,,1B1B R(1B1B1Br@   r  r   )r   r   environlistdirr   r/   r   r	   r   r  r<  r  rf   r   conda_interfacer  rY  re   r  r"   r  )r*   dumpbin_exepfx86programsr   r  r  rZ   r  r   linesversionr  exportsflagr  s                  @r$   get_static_lib_exports_dumpbinr    s    "),,K %	 
./
 
z%((
 
 
  	 	Arw||E1557GHHG! 	 	"*%  !kmm C  JJw//::<<E#AhnnS11"5GNNFG#45555D	 	322222&B&B&B&BCCCbk!n tKEG(  	%.(;5QU  kmm C jj))4466Gz!! !(       !(      	 	 	 CCCCDDDGGG		
 LLNNNNs    >BDD
B$G//HHc                    t          |           }t          |           }||S ||S ||k    rt          d| d| d           |S )NzERROR :: res_nm != res_dumpbin
z
 != 
r  )r  r  r"   )r*   res_nmres_dumpbins      r$   !get_static_lib_exports_externallyr    se    &x00F0::K~PPPPPPQQQMr@   c           
        g }|r-t          | t                    rt          j                            |           r|                     d          s|                     d          rt          |           rt          st          st          rt          |           }t          r|}n2	 t          |           \  }}}}n#  t          d|  d           g }Y nxY w|}t          rQ|rNt          |          t          |          k    r-t          |                              t          |                    }	t          |                              t          |                    }
t          |	          t          |
          z   }t          r3t          d| dt          |	           dt          |
           d           t          r#t          d|  d	t          |           d
           t          d                    dg|	R                      t          d                    dg|
R                      |s"t!          |           }|rd |j        D             }|S )Nz.az.libz,WARNING :: Failed to get_static_lib_exports(r   zerrors: z (-z, +z8WARNING :: Disagreement regarding static lib exports in z between nm (nsyms=z') and lielfldd (nsyms={len(exports2)}):r  z(** nm.diff(liefldd) [MISSING SYMBOLS] **z(** liefldd.diff(nm) [  EXTRA SYMBOLS] **c                ,    g | ]}t          |          S rJ   r
  r   s     r$   rN   zget_exports.<locals>.<listcomp>%  s    @@@c!ff@@@r@   )r   r    r   r/   r   rE   r  r   rV  r  ry  r"   r   
differencer(   r   r%   exported_functions)r*   r   enable_staticrZ   r  exports2flags2exports2_all
flags2_alldiff1diff2error_countr,   s                r$   get_exportsr    s   F /Hc22 /GNN8$$.	""4((.	,4,=,=f,E,E.	 8$$.	 	.	 % F F;HEE  
"""AW B B>HflJJ"TTTTUUU!HHHF$  s7||s8}}<<LL33CMMBBEMM44S\\BBE"%e**s5zz"9K, WUUUUUUE

UUUVVV, @'@ @<?LL@ @ @  
 		#M"VPU"V"VWW   		#M"VPU"V"VWW    Ax(( 	A@@f&?@@@FMs   'B< <Cc                ^   t           j                            |           sg S 	 t          j        |           }g }t          |j                  rE|j        D ];}|j        r2|j        r+|j        j	        r|
                    |j        j	                   <|S n#  t          d|  d           Y nxY wg S )Nz)WARNING: liefldd: failed get_relocations(r   )r   r/   r   r   r   r(   relocations
has_symbolr-   rK   r   r"   )r*   r   r,   resr  s        r$   get_relocationsr  )  s    7>>(## 	
GH%%v!"" 	' 2 2< 2x 2AHM 2

18=111J	GE(EEEFFFFFIs   A.B B*c                   t          |           }d}d}t          |t          j        j                  r+|j        r$	 |j        }|j        }||j        z   dz
  }n#  Y nxY wg }	t          |j
                  r|j
        }
n:t          |j                  r|j        }
nt          |j                  r|j        }
ng }
t          |
          D ]\  }}t          dk    rt          |           d}||k    o||k    }|j        t          j        j        k    rat          |t"                    rd|z  }n^d|j        z  }|j        r|j        rt          d|j         d           |j        rd}d}n"|j        rd}nd|j        z  }|j        dz  rdnd}|du s|du r9|r|r|	                    d|z             |s|r|	                    d|z             |	S )	Nr   rD   r   Tz%szWeird, symbol z is both imported and exportedF)r%   r   r   rQ   r   has_dynamic_symbol_commanddynamic_symbol_commandidx_undefined_symbolnb_undefined_symbolsr(   r  r'   static_symbols	enumeraterV  r"   	__class__r    rK   exportedimportedrx   r   )r   rQ  rR  notexportedr   r,   first_undefined_symbollast_undefined_symboldyscmdr  rb  r  r#  is_notexportedis_undefineds_names                   r$   rZ  rZ  ;  sC   4  F&$*+,, 1R 	2F%+%@"&)DDqH "!	D
C
6$%% (	V^		 ~	V"	#	# $dOO * *q 1$$!HHH ++N9N0N 	 tz000!S!! 
): S!* SQ16QQQRRR: )#'L%*NNZ )#(LAF]F&'fqj:UUdN $.E"9"9 *	 *

4&=))))! *g *

4&=)))Js   A Ac                      e Zd ZdZd Zd ZdS )memoized_by_arg0_filehasha  Decorator. Caches a function's return value each time it is called.
    If called later with the same arguments, the cached value is returned
    (not reevaluated).

    The first argument is required to be an existing filename and it is
    always converted to an inode number.
    c                R    || _         i | _        t          j                    | _        d S r5   )funccache	threadingLocklock)selfr  s     r$   __init__z"memoized_by_arg0_filehash.__init__~  s#    	
N$$			r@   c                :   g }|D ]}||d         u rt          j                    }t          |d          5 }	 |                    d          }|sn|                    |           .	 d d d            n# 1 swxY w Y   |                                }t          |t                    r#|                    t          |                     t          |t                    s | j        |i |c S |                    |           t          |          }|t          t          |                                                    f}| j        5  || j        v r| j        |         cd d d            S  | j        |i |}	|	| j        |<   |	cd d d            S # 1 swxY w Y   d S )Nr   r  Ti   )hashlibsha1r  r  update	hexdigestr   r   r   tupler   r  	frozensetrY  itemsr  r  )
r  argskwnewargsargr  r  datar  values
             r$   __call__z"memoized_by_arg0_filehash.__call__  sJ    	$ 	$Cd1g~~|~~#t__ ** vve}}# "!D)))	* "	* * * * * * * * * * * * * * * nn&&#t$$ $uSzz****X.. $ !ty$-"-----s####..	&"4"4556Y 	 	dj  z#	 	 	 	 	 	 	 	 "	4.2.."'
3	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s)   0A11A5	8A5	F+FFFN)__name__
__module____qualname____doc__r  r  rJ   r@   r$   r  r  u  s<         % % %
    r@   r  c                &    t          | ||          S )N)r   r  )r  )r*   r   r  s      r$   get_exports_memoizedr    s    xd-HHHHr@   c                $    t          | |          S N)r   )r  r*   r   s     r$   get_imports_memoizedr    s    xd++++r@   c                $    t          | |          S r  )r  r  s     r$   get_relocations_memoizedr    s    8$////r@   c                (    t          | |||          S )N)rQ  rR  r   )rZ  )r*   rQ  rR  r   s       r$   get_symbols_memoizedr    s    xIDQQQQr@   c                ,    t          | |||||          S )Nr  )r  )r*   r   r   rF   r   r   s         r$   get_linkages_memoizedr    s-     +   r@   )r   r   r   r   )F)r/   r0   r1   r2   r   r3   )r   )r   r   )TTr   r   r   )r   )r   F)TTFr   )r   r   r   )N
__future__r   r  r   r   r  r  collections.abcr   r   	functoolsr   pathlibr   
subprocessr   r	   utilsr   r   r   externalr   pylddr   r   r   r   r   r  r   loggingdisabler  ImportErrorr%   r.   r?   rG   r[   rj   ru   r   r>   rl   rm   r   ro   r   r   rr   r   r   r   rV   r   r   r   r   r  r  r  rV  r  ry  r{  r  r  r  r  r  rZ  r  r  r  r  r  r  rJ   r@   r$   <module>r      s3   # " " " " "   				      $ $ $ $ $ $                   " " " " " " " " , , , , , , , , , , % % % % % %
 8 7 7 7 7 7 7 7 7 7 7 7 = = = = = =KKKLII   III   " " "$  & $     , &%%%%%    6    .  32 2 2B w$H)1  
 W$H)/  NN    ; ; ;  U U U U4   :L L L   &$ $ $  4 S2 S2 S2 S2r 	I I I I\ 	- - - -`7 7 7 7
    8 8 8
a
 a
 a
H    8E E EP	 	 	7 7 7 7t   $7 7 7 7t* * * * * * * *Z I I I I , , , , 0 0 0 0 R R R GO
 
 
 
 
 
s   A> >BB