
    xheб                        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
 ddlmZmZmZmZmZ  ej        ej                   	 	 dZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZ dZ!eeee!e fZ"dZ#de#z  Z$ej%        d          Z&e&dk    r e'ed          p e'ed          Z( G d de)          Z* G d d          Z+ G d d           Z, G d! d"          Z-dd$Z.d% Z/d& Z0d' Z1d( Z2 G d) d*          Z3d+ Z4dd-Z5d. Z6	 	 	 	 dd0Z7d1 Z8 G d2 d3e-          Z9d4Z:d#Z;dZ<dZ=d5Z>d Z?dZ@dZAd6ZBd7ZCd8ZDd9ZEd:ZFd;ZGd<ZHd=ZId ZJd#ZKdZLdZMd5ZNd>ZOd?ZPd@ZQdAZRdBZSeQdCz   ZTeQdDz   ZUeQdEz   ZVd#ZWdZXdZYd5ZZd>Z[d?Z\dFZ]d6Z^dGZ_dHZ`dIZadJZbdKZcdLZddMZedNZfdOZgd@Zhd#ZidZjd5ZkdLZldZmdPZndQZodRZpdSZqdTZrdUZsdVZtdWZudXZvd Zwd#ZxdZydZzd5Z{d>Z|d?Z}dFZ~d6ZdGZdHZdIZdZdZdJZdKZdLZdMZdNZdOZd7ZdYZdZZd[ZdZd\Zd]Zd^ZdZd_Zd@Zd`ZdAZdBZ G da db          Z G dc dd          Z G de df          Z G dg dhe-          Z G di dje-          Z G dk dle-          Z G dm dn          Zdog fdpZ	 dddxZdy Zdz Zdd|Z	 dd~ZddZd Zd Zd Zd Zd Zedk    r ej         e                       dS dS )    )annotationsN)Path   )ensure_list
get_loggeron_linuxon_macon_win)levela  
Usage: ldd [OPTION]... FILE...
      --help              print this help and exit
      --version           print version information and exit
  -d, --data-relocs       process data relocations
  -r, --function-relocs   process data and function relocations
  -u, --unused            print unused direct dependencies
  -v, --verbose           print all information

For bug reporting instructions, please see:
<https://bugs.archlinux.org/>.
ap  
Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool [-arch arch_type] [-fahlLDtdorSTMRIHGvVcXmqQjCP] [-mcpu=arg] [--version] <object file> ...
    -f print the fat headers
    -a print the archive header
    -h print the mach header
    -l print the load commands
    -L print shared libraries used
    -D print shared library id name
    -t print the text section (disassemble with -v)
    -p <routine name>  start dissassemble from routine name
    -s <segname> <sectname> print contents of section
    -d print the data section
    -o print the Objective-C segment
    -r print the relocation entries
    -S print the table of contents of a library
    -T print the table of contents of a dynamic shared library
    -M print the module table of a dynamic shared library
    -R print the reference table of a dynamic shared library
    -I print the indirect symbol table
    -H print the two-level hints table
    -G print the data in code table
    -v print verbosely (symbolically) when possible
    -V print disassembled operands symbolically
    -c print argument strings of a core file
    -X print no leading addresses or headers
    -m don't use archive(member) syntax
    -B force Thumb disassembly (ARM objects only)
    -q use llvm's disassembler (the default)
    -Q use otool(1)'s disassembler
    -mcpu=arg use `arg' as the cpu for disassembly
    -j print opcode bytes
    -P print the info plist section as strings
    -C print linker optimization hints
    --version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool
l   z} l   m l   z} l   m l   : ><         #          l              maxsizemaxintc                      e Zd ZdS )IncompleteReadN)__name__
__module____qualname__     :lib/python3.11/site-packages/conda_build/os_utils/pyldd.pyr   r      s        Dr   r   c                  $    e Zd ZdZd Zd Zd ZdS )ReadCheckWrapperzG
    Wrap a file-object to raises a exception on incomplete reads.
    c                    || _         d S N)	_file_obj)selffile_objs     r   __init__zReadCheckWrapper.__init__   s    !r   c                ~    | j                             |          }t          |          |k    rt          d          |S )Nz(requested number of bytes were not read.)r$   readlenr   )r%   sizebufs      r   r)   zReadCheckWrapper.read   s<    n!!$''s88t !KLLL
r   c                F    |dk    r| j         S t          | j        |          S )Nr)   )r)   getattrr$   )r%   attrs     r   __getattr__zReadCheckWrapper.__getattr__   s%    6>>94>4000r   N)r   r   r   __doc__r'   r)   r0   r   r   r   r!   r!      sK         " " "  1 1 1 1 1r   r!   c                  H    e Zd ZdZdefdZd Zd Zd ZddZ	d Z
efd	Zd
S )fileviewzh
    A proxy for file-like objects that exposes a given view of a file.
    Modified from macholib.
    r   c                    t          |t                    r|j        | _        n|| _        || _        ||z   | _        d| _        d S )Nr   )
isinstancer3   _fileobj_start_end_pos)r%   fileobjstartr+   s       r   r'   zfileview.__init__   sD    gx(( 	$#,DMM#DMDL				r   c                0    d| j         | j        | j        fz  S )Nz<fileview [%d, %d] %r>)r7   r8   r6   r%   s    r   __repr__zfileview.__repr__   s    '4;	4=*QQQr   c                    | j         S r#   )r9   r=   s    r   tellzfileview.tell   
    yr   c                x    | j         |cxk    r| j        k    s"n t          d||| j         | j        fz            d S )Nz*%s to offset %d is outside window [%d, %d])r7   r8   OSError)r%   seektoops      r   _checkwindowzfileview._checkwindow   sW    v22222222<vt{DI67   32r   c                ^   |}|t           j        k    r|| j        z  }nP|t           j        k    r|| j        | j        z   z  }n-|t           j        k    r|| j        z  }nt          d|          |                     |d           | j	        
                    |           || j        z
  | _        d S )Nz!Invalid whence argument to seek: seek)osSEEK_SETr7   SEEK_CURr9   SEEK_ENDr8   rC   rF   r6   rH   )r%   offsetwhencerD   s       r   rH   zfileview.seek   s    R[  dk!FFr{""dkDI--FFr{""diFFHfHHIII&&)))6"""T[(			r   c                T   | j         | j        z   }|                     |d           |                     |t          |          z   d           | j                            |t          j                   | j                            |           | xj        t          |          z  c_        d S )Nwrite)	r7   r9   rF   r*   r6   rH   rI   rJ   rP   )r%   bytesheres      r   rP   zfileview.write   s    {TY&$((($U+W5554---E"""		SZZ				r   c                H   |dk    sJ | j         | j        z   }|                     |d           t          || j        |z
            }| j                            |t          j                   | j        	                    |          }| xj        t          |          z  c_        |S )Nr   r)   )r7   r9   rF   minr8   r6   rH   rI   rJ   r)   r*   )r%   r+   rR   rQ   s       r   r)   zfileview.read   s    qyyyy{TY&$'''4T)**4---""4((		SZZ		r   N)r   )r   r   r   r1   r   r'   r>   r@   rF   rH   rP   r)   r   r   r   r3   r3      s         
 '(f    R R R    ) ) ) )            r   r3   c                  <    e Zd Zg fdZd Zd Zd Zd Zd Zd Z	dS )	UnixExecutablec                L    g | _         g | _        g | _        g | _        || _        d S r#   )rpaths_transitiverpaths_nontransitiveshared_libraries
dt_runpath	dt_sonamer%   fileinitial_rpaths_transitives      r   r'   zUnixExecutable.__init__   s,    !#$&! "2r   c                    | j         S r#   )rX   r=   s    r   get_rpaths_transitivez$UnixExecutable.get_rpaths_transitive   s    %%r   c                    | j         S r#   )rY   r=   s    r   get_rpaths_nontransitivez'UnixExecutable.get_rpaths_nontransitive   s    ((r   c                    | j         S r#   )rZ   r=   s    r   get_shared_librariesz#UnixExecutable.get_shared_libraries   s    $$r   c                    dS )NTr   r=   s    r   is_executablezUnixExecutable.is_executable       tr   c                    | j         S r#   )r[   r=   s    r   get_runpathszUnixExecutable.get_runpaths   s
    r   c                    | j         S r#   r\   r=   s    r   
get_sonamezUnixExecutable.get_soname  
    ~r   N)
r   r   r   r'   ra   rc   re   rg   rj   rm   r   r   r   rV   rV      s        79 3 3 3 3& & &) ) )% % %        r   rV      c                    t          j        |d|z  z   |                     |dz                      }t          |          dk    r|d         S |S )zm
    Read a given number of 32-bits unsigned integers from the given file
    with the given endianness.
    L   ro   r   )structunpackr)   r*   )r^   endiannumress       r   	read_datarx     sK    
 -s*DIIcAg,>,>
?
?C
3xx1}}1vJr   c                   |t            z  t          v rt          | |          }|                     ||z   t          j                   |                     ||z
                                            }	|	d |	                    d                   }	|	|k    rO|                     ||z   t          j                   | 	                    |
                                dz              dS dS )N     TF)LC_REQ_DYLDLC_LOAD_DYLIBSrx   rH   rI   rJ   r)   decodeindexrP   encode)
r^   wherebitsru   cmdcmdsizewhatvalname_offsetloads
             r   replace_lc_load_dylibr     s    
k\^++  f--		%+%r{333yy;.//6688&djj&&&'4<<IIek)2;777JJszz||e+,,,45r   c                P   |t            z  t          v rt          | |          }|                     ||z   t          j                   |                     ||z
                                            }|d |                    d                   }t          j
        ||          r|S d S d S Nrz   )r|   r}   rx   rH   rI   rJ   r)   r~   r   rematch)	r^   r   r   ru   r   r   r   r   r   s	            r   find_lc_load_dylibr   #  s    
k\^++  f--		%+%r{333yy;.//6688&djj&&&'8D$ 	K ,+	 	r   c                   |t           k    r|t          | |          }|                     ||z   t          j                   |                     ||z
                                            }|d |                    d                   }|S d S r   )LC_RPATHrx   rH   rI   rJ   r)   r~   r   )r^   r   r   ru   r   r   r   r   s           r   find_lc_rpathr   2  s    
h  f--		%+%r{333yy;.//6688&djj&&&' r   c                f   t          | |d          \  }}}}}	}
|dk    rt          | |           g }t          |          D ]n}|                                 }t          | |d          \  }}|                     || |||||g|R             |                     ||z   t
          j                   o||fS )N   @   r   )rx   ranger@   appendrH   rI   rJ   )r^   r   ru   lc_operationargs_cputype_cpusubtypefiletypencmds_sizeofcmds_flagsresults_nr   r   r   s                   r   do_machor   ?  s    BKfaC C?Hk8UK rzz$GEll 0 0		 vq11W||D%vsGSdSSSTTT		%'/2;////Wr   c                      e Zd ZdefdZdS )offset_sizer   c                "    || _         || _        d S r#   )rM   r+   )r%   rM   r+   s      r   r'   zoffset_size.__init__T  s    			r   N)r   r   r   r   r'   r   r   r   r   r   S  s-        f      r   r   c           	        t          | |j        |j                  } t          | t                    }|t
          k    rdt          | t                    }t          |          D ]=}t          | t          d          \  }	}
}}}t          | |t          ||          ||g|R   >d S |t          k    r.|dv r*|
                    t          | dt          |g|R             d S |t          k    r.|dv r*|
                    t          | dt          |g|R             d S |t          k    r.|dv r*|
                    t          | dt          |g|R             d S |t          k    r.|dv r,|
                    t          | dt          |g|R             d S d S d S )N   )anyppc32m68kr   )r   i386)r   ppc64r   )r   x86_64)r3   rM   r+   rx   
BIG_ENDIAN	FAT_MAGICr   do_filer   MH_MAGICr   r   MH_CIGAMLITTLE_ENDIANMH_MAGIC_64MH_CIGAM_64)r^   r   off_szarchr   r   magic	nfat_archr   r   r   rM   r+   _aligns                 r   r   r   Y  s   D&-55DdJ''E	dJ//		"" 	Y 	YB:CD*VW:X:X7Hk64D,FD(A(A4XSWXXXXX	Y 	Y 
(		t'???xb*lJTJJJKKKKK	(		t66xb-MMMMNNNNN	+		$*:":":xb*lJTJJJKKKKK	+		$*;";";xb-MMMMNNNNN 
	";";r   .*c                T    g }t          | t          t                      |||           |S )z
    Finds the executable's view of where any dylibs live
    without resolving any macros (@rpath, @loader_path, @executable_path)
    )r   r   r   )ofiler   regexr   s       r   mach_o_find_dylibsr   n  s+    
 GE%{}}dGUKKKNr   c                R    g }t          | t          t                      ||           |S )z&
    Finds ofile's list of rpaths
    )r   r   r   )r   r   r   s      r   mach_o_find_rpathsr   x  s(     GE=+--w???Nr    c                   d}d}	|sg n|                     d          }
                    d          r|r|gnG|                                 |
z   |                                 z   fdt	          |          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
    NF:$RPATHc                <    g | ]}|                     d           S )z$SYSROOTreplace).0dpsysroots     r   
<listcomp>z*_get_resolved_location.<locals>.<listcomp>  s'    TTT2rzz*g..TTTr   $SELFDIR$EXEDIRTc              3      K   | ]}|v V  	d S r#   r   )r   a
unresolveds     r   	<genexpr>z)_get_resolved_location.<locals>.<genexpr>  s'      >>Q*_>>>>>>r   )r   r   /)split
startswithra   rc   r   r   rI   pathexistsr   join)codefiler   exe_dirself_dirLD_LIBRARY_PATHdefault_pathsr   resolved_rpathrpath_resultfoundld_library_pathsthese_rpathsrpathresolvedr   exists_sysroots    `    `         r   _get_resolved_locationr     s=   \ LE!0Prro6K6KC6P6PX&&  C U^//11//112 UTTT]9S9STTTU 	 " 	 	E""8U33X..G,, 
 W^^H--F#PPH4G4G4P4PN  > $  	+tU**	+ 
>>>>&=>>>	>	> C%%j(;;CCIwWW))LGL0C0CG0L0L  %% 	CtU**7<<*55tUBB\>11r   c                h    t          | |||          \  }}}|r|}	nt          | ||||          }	||	|fS r#   )r   )
r   so
src_exedirsrc_selfdir
dst_exedirdst_selfdirsrc_resolvedr   
in_sysrootdst_resolveds
             r    _get_resolved_relocated_locationr     s]     '="j+' '#L%  
#-b*k5
 
 z11r   c                  8    e Zd Zg fdZd Zd Zd	dZd Zd ZdS )
	machofilec                &    |j          _        g  _        g  _        t          j                            |j                    _        t          ||          }|sd S t          | \  }}|
                    d           | _        t          t          ||           \  }} fd|d         D             }	 j                            |	           |	 _         j                             fd|d         D                        |
                    d           d S )Nr   c                d    g | ],}|                     |                    d                     -S r   )from_os_varnamesrstripr   r   r%   s     r   r   z&machofile.__init__.<locals>.<listcomp>  sH     
 
 
9>u
!!%,,s"3"344
 
 
r   c                B    g | ]}||                     |          fS r   r   )r   r   r%   s     r   r   z&machofile.__init__.<locals>.<listcomp>  s1    DDDDb$''++,DDDr   )namefilenamerZ   r[   rI   r   dirname_dirr   ziprH   rX   r   extendrY   )
r%   r^   r   r_   r   _sos
_filetypesrpathslocal_rpathss
   `         r   r'   zmachofile.__init__  s$   	 "GOODI..	$T400 	Fg3		!!: "4T4"@"@A
F
 
 
 
BH)
 
 
 	%%l333$0!$$DDDDs1vDDD	
 	
 	
 			!r   c                ~    |                     dd                               dd                               dd          S )LDon't make these functions - they are methods to match the API for elffiles.r   @loader_pathr   @executable_pathr   @rpathr   r%   input_s     r   to_os_varnameszmachofile.to_os_varnames  s9     NN:~66WY 233WXx((	
r   c                ~    |                     dd                               dd                               dd          S )r  r  r   r  r   r	  r   r   r
  s     r   r   zmachofile.from_os_varnames  s9     NN>:66W'33WXx((	
r   r   c                    g }| j         D ]5\  }}t          | ||||          \  }}}	|                    ||||	f           6|S r#   )rZ   r   r   )
r%   r   r   r   resultso_origr   r   r   r   s
             r   get_resolved_shared_librariesz'machofile.get_resolved_shared_libraries  se    0 	B 	BKGR*@b*k7+ +'HeZ MM7HeZ@AAAAr   c           	         g }| j         D ]3}t          | |||||          \  }}}	|                    ||||	f           4|S r#   )rZ   r   r   )
r%   r   r   r   r   r  r   r   r   r   s
             r   get_relocated_shared_librariesz(machofile.get_relocated_shared_libraries  se     ' 	D 	DB1Qb*k:{2 2.HlJ MM2xzBCCCCr   c                    | j         S r#   )r   r=   s    r   uniqueness_keyzmachofile.uniqueness_key!  s
    }r   Nr   )	r   r   r   r'   r  r   r  r  r  r   r   r   r   r     s{        =?    ,
 
 

 
 
   	 	 	    r   r   iFLErr         (   *   2   >         r   r   i   `i   piiPtiQtiRt   	   
                        r         i   i   i  l      ` i   i                        ioc                      e Zd Zd Zd ZdS )	elfheaderc                d	   t          j        t          dz   |                    d                    \  | _        g | _        g | _        | j        t          k    rd S t          j        t          dz   |                    d                    \  }|dk    rdnd}t          |dz            }|dk    rdnd}|| _
        || _        || _        t          j        t          dz   |                    d                    \  }|dk    rt          nt          }|| _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |d	z   |                    d
                     t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        ||z   |                    |                    \  | _        t          j        ||z   |                    |                    \  | _        t          j        ||z   |                    |                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        |                                }|| j        k    r4t=          t>                                         d| d| j                    d S d S )Nrq   rr   Bro   r   r   r  QBBBBBBBr  Hr   zfile.tell()=z != ehsize=)!rs   rt   r   r)   hdr	dt_neededdt_rpathELF_HDRr   intbitnesssz_ptrptr_typeru   versionosabiabivertypemachineentryphoffshoffflagsehsize	phentsizephnum	shentsizeshnumshstrndxr@   r   r   warning)r%   r^   r>  r?  r@  ru   locs          r   r'   zelfheader.__init__  s   mJ$4diillCC8wF]=3#6		!EE
1"""Wq[!! A++333 M-#"5tyy||DD	"(A++: -diillCCfslDIIaLLAAv|TYYq\\BBfw&		!555}Vc\499Q<<@@ -diillCC -diillCCfx&769J9JKKfx&769J9JKKfx&769J9JKKfslDIIaLLAAv|TYYq\\BB"M&3,		!EEfslDIIaLLAA"M&3,		!EEfslDIIaLLAA!=#tyy||DDiikk$+x  (()U)U)U)U)UVVVVV r   c                    d| j          d| j         d| j         d| j         dt	          | j                   dt	          | j                   S )Nzbitness z	, endian z
, version z, type z
, machine z, entry )r>  ru   rA  rD  hexrE  rF  r=   s    r   __str__zelfheader.__str__  s~    Vt| V Vdk V VT\ V VIV V),T\):):V VDG
OOV V	
r   N)r   r   r   r'   rT  r   r   r   r3  r3    s6        #W #W #WJ
 
 
 
 
r   r3  c                      e Zd Zd Zd ZdS )
elfsectionc                X   |j         }|j        }|j        }t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        ||z   |                    |                    \  | _        t          j        ||z   |                    |                    \  | _	        t          j        ||z   |                    |                    \  | _
        t          j        ||z   |                    |                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        |dz   |                    d                    \  | _        t          j        ||z   |                    |                    \  | _        t          j        ||z   |                    |                    \  | _        | j        t           k    r	d| _        d S d| _        d S )Nrq   rr   r   ro   )r@  r?  ru   rs   rt   r)   sh_namesh_typesh_flagssh_addr	sh_offsetsh_sizesh_linksh_infosh_addralign
sh_entsize
SHT_STRTABpriorityr%   ehr^   r@  r?  ru   s         r   r'   zelfsection.__init__  s   ; !-diillCC -diillCC!=():DIIf<M<MNN -(9499V;L;LMM"M&8*;TYYv=N=NOO -(9499V;L;LMM -diillCC -diillCC%}Vh->		&@Q@QRR	#]6H+<dii>O>OPP <:%%DMMMDMMMr   c                j   |j         j        }|j         j        }|j         j        }| j        t
          k    rM|                    | j                   |                    | j	                  
                                | _        d S | j        t          k    rd }g }g }g }	d}
| j        dk    rd}nt          | j	        | j        z            }t          |          D ] }|                    | j        || j        z  z              t!          j        ||z   |                    |                    \  }t!          j        ||z   |                    |                    \  }|t$          k    r|                    |           |t(          k    r|                    |           |t*          k    r|	                    |           |t,          k    r|}|t.          k    r|}
|r|                    |          \  }}|r|j        t
          k    r|D ]N}||j        |d                              d          z   }|j                            |j        ||                    O|D ]{}||j        |d                              d          z   }|j        ||         fd                    d          D             }|j                            d |D                        ||	D ]{}||j        |d                              d          z   }|j        ||         fd                    d          D             }|j                            d |D                        ||
dk    r9|
|j        |
d                              d          z   }|j        |
|         |_        tA          |j                  rg |_        d S d S d S )	N$EXECUTABLEr   rz   c                    g | ]}|S r   r   r   pr   s     r   r   z*elfsection.postprocess.<locals>.<listcomp>*      !E!E!E!E!!E!E!Er   r   c                8    g | ]}|                     d           S r   r   r   rj  s     r   r   z*elfsection.postprocess.<locals>.<listcomp>+  s"    0O0O0O1#0O0O0Or   c                    g | ]}|S r   r   ri  s     r   r   z*elfsection.postprocess.<locals>.<listcomp>/  rk  r   c                8    g | ]}|                     d           S r   rm  rn  s     r   r   z*elfsection.postprocess.<locals>.<listcomp>0  s"    2Q2Q2QQ188C==2Q2Q2Qr   )!ehdrr@  r?  ru   rY  rb  rH   r\  r)   r]  r~   tableSHT_DYNAMICra  r=  r   rs   rt   	DT_NEEDEDr   DT_RPATH
DT_RUNPATH	DT_STRTAB	DT_SONAMEfind_section_and_offsetr   r:  r   r;  r   r[   r\   r*   )r%   elffiler^   r@  r?  ru   dt_strtab_ptrr:  r;  r[   r\   num_entriesmd_tag	d_val_ptrstrsec_offsetnendrr  r   s                        @r   postprocesszelfsection.postprocess  s   <($$<:%%IIdn%%%4<007799DJJJ\[((X !MIHJ%I!##  !$,"@AA;'' * *		$.A,?@AAA!=():DIIf<M<MNN%}Vh->		&@Q@QRRI%%$$Y////h&&OOI....j((%%i0000i''$-MMi'' )I H")"A"A-"P"P Hfn
::& F F&,qrr"2"8"8">">>)00ae1DEEEE% Q Q&,qrr"2"8"8">">>%|AcE2!E!E!E!ETZZ__!E!E!E(//0O0O0O0O0OPPPP' S S&,qrr"2"8"8">">>%|AcE2!E!E!E!ETZZ__!E!E!E*112Q2Q&2Q2Q2QRRRR M11'&,yzz*B*H*H*N*NN,2L3,G) 7%&& &#%   w )(t& &r   Nr   r   r   r'   r  r   r   r   rV  rV    s7          .b& b& b& b& b&r   rV  c                      e Zd Zd Zd ZdS )programheaderc                   |j         }|j        }|j        }t          j        |dz   |                    d                    \  | _        |j        dk    r2t          j        |dz   |                    d                    \  | _        t          j        ||z   |                    |                    \  | _	        t          j        ||z   |                    |                    \  | _
        t          j        ||z   |                    |                    \  | _        t          j        ||z   |                    |                    \  | _        t          j        ||z   |                    |                    \  | _        |j        dk    r2t          j        |dz   |                    d                    \  | _        t          j        ||z   |                    |                    \  | _        d S )Nrq   rr   r   r   )r@  r?  ru   rs   rt   r)   p_typer>  p_flagsp_offsetp_vaddrp_paddrp_fileszp_memszp_alignrd  s         r   r'   zprogramheader.__init__;  s   ;v|TYYq\\BB:$mFSL$))A,,GGOT\!=():DIIf<M<MNN -(9499V;L;LMM -(9499V;L;LMM!=():DIIf<M<MNN -(9499V;L;LMM:$mFSL$))A,,GGOT\ -(9499V;L;LMMr   c                   | j         t          k    rP|                    | j                   |                    | j        dz
                                            |_        d S | j         t          k    r|                    | j                   t          |d          r@|j
                            | j                   |j                            | j                   d S | j        g|_
        | j        g|_        d S d S )Nro   ptload_p_vaddr)r  	PT_INTERPrH   r  r)   r  r~   program_interpreterPT_LOADhasattrr  r   r  ptload_p_paddrr  )r%   rz  r^   s      r   r  zprogramheader.postprocessK  s    ;)##IIdm$$$*.))DMA4E*F*F*M*M*O*OG'''[G##IIdm$$$w 011 8&--dl;;;&--dl;;;;;*.,&*.,&&& $#r   Nr  r   r   r   r  r  :  s5        N N N 8 8 8 8 8r   r  c                  D    e Zd Zg fdZd Zd Zd ZddZd Zd Z	d	 Z
d
S )rz  c                >    t          |           _        g  _        g  _        g  _        g  _        g  _        d  _        d _        t          j
                            |j                   _        t           j        j                  D ]^}|                     j        j        | j        j        z  z               j                            t)           j        |                     _t           j        j                  D ]^}|                     j        j        | j        j        z  z               j                            t1           j        |                     _ j                            d             j        D ]}|                     |            j        D ]}|                     |           d  j        D             }d  j        D             } fd||z   D              _         fd|D              _        d  j        D              _        d S )	Nrg  c                    | j         S r#   )rc  )xs    r   <lambda>z"elffile.__init__.<locals>.<lambda>k  s    AJ r   )keyc                8    g | ]}|                     d           S r   rm  rn  s     r   r   z$elffile.__init__.<locals>.<listcomp>z  s"    999aAHHSMM999r   c                8    g | ]}|                     d           S r   rm  rn  s     r   r   z$elffile.__init__.<locals>.<listcomp>{  s"    ===ahhsmm===r   c                :    g | ]}                     |          S r   r   r   s     r   r   z$elffile.__init__.<locals>.<listcomp>|  s7     "
 "
 "
 !!%(("
 "
 "
r   c                :    g | ]}                     |          S r   r   r   s     r   r   z$elffile.__init__.<locals>.<listcomp>  s4     %
 %
 %
-2D!!%((%
 %
 %
r   c                (    g | ]}|d |v r|nd|z   fS )r   z$RPATH/r   )r   neededs     r   r   z$elffile.__init__.<locals>.<listcomp>  s>     !
 !
 !
 sf}}VV)f2DE!
 !
 !
r   )r3  rq  r:  r;  r[   programheaderselfsectionsr  r\   rI   r   r   r   r   r   rL  rH   rG  rK  r   r  rN  rH  rM  rV  sortr  rX   rY   rZ   )r%   r^   r_   r  phesr;  r[   s   `       r   r'   zelffile.__init__Z  sK   dOO	 #' &GOODI..	ty'' 	G 	GAIIdioTY-@)@ABBB&&}TY'E'EFFFFty'' 	A 	AAIIdioTY-@)@ABBB##Jty$$?$?@@@@"6"6777% 	' 	'BNN4&&&&" 	' 	'BNN4&&&& :94=999==T_===
"
 "
 "
 "
3h>"
 "
 "
%
 %
 %
 %
6@%
 %
 %
!!
 !
.!
 !
 !
r   c                    | j         j        dk    rd}nd}|                    dd                              |d          S )Nr  /lib64/libr   $ORIGIN$LIBrq  r?  r   r%   inputlibdirs      r   r  zelffile.to_os_varnames  sB    9q  FFF}}Z33;;FFKKKr   c                    | j         j        dk    rd}nd}|                    dd                              d|          S )Nr  r  r  r  r   r  r  r  s      r   r   zelffile.from_os_varnames  sB    9q  FFF}}Y
33;;FFKKKr   c                    | j         D ]:}||j        k    r-||j        |j        z   k     r|j        dk    r,|||j        z
  fc S ;dS )zECan be called immediately after the elfsections have been constructedr   )NN)r  r[  r]  )r%   addrr  s      r   ry  zelffile.find_section_and_offset  sb    " 	- 	-Brz!!dRZ"*-D&D&D :??4"*,,,,,zr   r   c           
         g }ddg}| j         j        dk    r|                    ddg           | j        D ]8\  }}t	          | |||d||          \  }}	}
|                    |||	|
f           9|S )Nz$SYSROOT/libz$SYSROOT/usr/libr  z$SYSROOT/lib64z$SYSROOT/usr/lib64r   )r   r   r   )rq  r?  r   rZ   r   r   )r%   r   r   r   r  r   r  r   r   r   r   s              r   r  z%elffile.get_resolved_shared_libraries  s    ');<9q    "24H!IJJJ0 
	B 
	BKGR*@ "++ + +'HeZ MM7HeZ@AAAAr   c                    | j         S r#   r   r=   s    r   get_dirzelffile.get_dir  rA   r   c                    | j         S r#   rl   r=   s    r   r  zelffile.uniqueness_key  rn   r   c                    | j         S r#   rl   r=   s    r   rm   zelffile.get_soname  rn   r   Nr  )r   r   r   r'   r  r   ry  r  r  r  rm   r   r   r   rz  rz  Y  s        79 -
 -
 -
 -
^L L LL L L	 	 	   $        r   rz  c                  6    e Zd Zg fdZd Zd Zd Zd Zd ZdS )inscrutablefilec                    d | _         d S r#   r  r]   s      r   r'   zinscrutablefile.__init__  s    			r   c                    g S r#   r   r=   s    r   ra   z%inscrutablefile.get_rpaths_transitive      	r   c                    g S r#   r   r%   r   kws      r   r  z-inscrutablefile.get_resolved_shared_libraries  r  r   c                    g S r#   r   r=   s    r   rj   zinscrutablefile.get_runpaths  r  r   c                    | j         S r#   r  r=   s    r   r  zinscrutablefile.get_dir  rA   r   c                    dS Nunknownr   r=   s    r   r  zinscrutablefile.uniqueness_key      yr   N	r   r   r   r'   ra   r  rj   r  r  r   r   r   r  r    sv        79                r   r  c                  6    e Zd Zg fdZd Zd Zd Zd Zd ZdS )DLLfilec                    d S r#   r   r]   s      r   r'   zDLLfile.__init__  s    r   c                    g S r#   r   r=   s    r   ra   zDLLfile.get_rpaths_transitive  r  r   c                    g S r#   r   r  s      r   r  z%DLLfile.get_resolved_shared_libraries  r  r   c                    g S r#   r   r=   s    r   rj   zDLLfile.get_runpaths  r  r   c                    d S r#   r   r=   s    r   r  zDLLfile.get_dir  rh   r   c                    dS r  r   r=   s    r   r  zDLLfile.uniqueness_key  r  r   Nr  r   r   r   r  r    sv        79                r   r  c                      e Zd Zg fdZdS )EXEfilec                >    | j                             | ||           d S r#   )superr'   r]   s      r   r'   zEXEfile.__init__  s#    
D$(ABBBBBr   N)r   r   r   r'   r   r   r   r  r    s1        79 C C C C C Cr   r  r   c                   | j                             d          rt          | t          |                    S t	          j        t          dz   |                     d                    \  }|                     d           |t          t          t          t          fv rt          | |t          |                    S |t          k    rt          | t          |                    S t!          | t          |                    S )N.dllrq   rr   r   )r   endswithr  listrs   rt   r   r)   rH   r   r   r   r   r   r<  rz  r  )r^   r   r_   r   s       r   r   r     s    y&!! >tT";<<===}Z#-tyy||<<HUIIaLLLHh<<<tT*C%D%DEEE	'		tT";<<===tT*C%D%DEEEr   Fr   str | os.PathLike | Pathskip_symlinksboolreturn4type[DLLfile | EXEfile | machofile | elffile] | Nonec                `   t          |           } |r|                                 rd S |                                 } d
d}|                                 rd S | j                                        dv rt          S | j                                        dk    rt          S | j                                        dk    rd S |                                 r| 	                                j
        d	k     rd S  ||           x}t          k    rt          S |t          t          t          t           fv rt"          S d S )Nr   r   r  rQ   c                    |                      d          5 }|                    d          }d d d            n# 1 swxY w Y   t          j        t          dz   |          d         S )Nrbrr   rq   r   )openr)   rs   rt   r   )r   handlebits      r   _get_magic_bitz&codefile_class.<locals>._get_magic_bit  s    YYt__ 	!++a..C	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!}Z#-s33A66s   8<<)r  z.pydz.exez.classrr   )r   r   r  rQ   )r   
is_symlinkresolveis_dirsuffixlowerr  r  r   statst_sizer<  rz  r   r   r   r   r   )r   r  r  r   s       r   codefile_classr    s(   
 ::D ** t<<>>D7 7 7 7
 {{}} t					 0	0	0						&	&						(	(t[[]] diikk1A55t!>$''
'%G	3	3	9h+>	>	>tr   c                    | r^|                      d          s|                      d          r4| d d         } |                      d          |                      d          4| S )Nr   \)r  )r   s    r   _trim_sysrootr    st     #s## 	#w'7'7'='= 	#crclG s## 	#w'7'7'='= 	#Nr   c                |    | dk    r5t           rt          j        dk    rdnd} nt          j                    \  }}}}} | S )Nnativel        r   i686)r
   sysr   rI   uname)r   r   s     r   _get_arch_if_nativer  !  sG    x 	*"{U2288DD!xzzAq!QKr   r  c                   t           j                            |           sdg g fS t          |          }t	          |          }t          | d          5 }	 t          t          |          |          }nK# t          $ r> t          t                                        d|             dg g fcY cddd           S w xY wt           j                            |           }|                    |||          }|s#|                                g g fcddd           S t          t           t#          |           \  }}}	}
|                                ||fcddd           S # 1 swxY w Y   dS )zM

    :param filename:
    :param sysroot:
    :param arch:
    :return:
    Nr  z!problems inspecting linkages for )rI   r   r   r  r  r  r   r!   r   r   r   rP  r   r  r  mapr  r   )r   r   r   fcfr   r   
orig_namesresolved_namesr   _in_sysroots              r   _inspect_linkages_thisr   ,  s    7>>(## R|G$$Gt$$D	h		 ?	 *1--t44BB 	  	  	  x  (()WX)W)WXXXR<? ? ? ? ? ? ? ?	 
 '//(++227GWMM 	/$$&&B.? ? ? ? ? ? ? ? 69sG}5M5M2
NA{  ""J>!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s=   EA32E39B;,E:B;;AE7EE!$E!Tc                   t                      }| h}t                      }i }||k    rt          t          ||z
                      } t          | ||          \  }	}
}|	|vrpt	          |
|          D ]3\  }}|r#|t
          j                            |          d}nd|i}|||<   4|r|                    |           |	                    |	           |	                    |            ||k    |S )N)r   r   )origr   r  )
setnextiterr   r   rI   r   normpathupdateadd)r   resolve_filenamesrecurser   r   already_seentododoner   r  
these_origthese_resolvedr  r   recs                  r   inspect_linkagesr  M  s    55L:D55DG
$,,TD[))**5KgD6
 6
 6
2
N --"%j."A"A $ $h$ )#'RW5E5Eh5O5OPPCC!4.C # ,N+++^,,, $,,  Nr   c                \   ddl m} dg}|dk    r|                    d|g           n.|                    dt          j                    d         g           |                    d| g            ||                              d	          }t          j        d
|t          j                  }|S )Nr   )check_outputz/usr/bin/otoolr  -archrr   -Lasciiencodingz^\t(.*) \(compatibility)	
subprocessr  r   rI   r  r~   r   findall	MULTILINE)r   r   r  r   r  groupss         r   inspect_linkages_otoolr  g  s    ''''''DxWdO$$$$ 	Wbhjjm,---KKx !!!\$&&&88FZ2FBLIIFMr   c                    ddl m}m}  |d| g||          }|                                \  }}|                    d          }|                    d          }t          j        d|t
          j                  }|S )Nr   )PIPEPopenz/usr/bin/ldd)stdoutstderrr  r  z7^\t(?!linux-gate\.so\.1.*$)[^ ]+ => (.*) \([0-9a-fx]+\))r  r  r   communicater~   r   r  r  )r   r  r   processr  errr  s          r   inspect_linkages_lddr&  w  s    &&&&&&&&e^X.tDIIIG%%''KFC]]G],,F
**g*
&
&CZBFBL F Mr   c                    t          j        dd          }|                    ddd           |                    dd	d	d
           |                    ddd           |                    |           } | j        rt          t                     dS | j        r9t          | j        dd| j	                  }t          d| j         d|            dS dS )NotoolFprogadd_help-h--help
store_trueactionr  	arch_typer  )desthelpdefaultr  r   zprint shared libraries used)r2  r3  r   )r	  r
  r   z&Shared libs used (non-recursively) by  are:
ro   )
argparseArgumentParseradd_argument
parse_argsr3  printOTOOL_USAGEr   r  r1  r   parsershared_libss      r   r(  r(    s    $'EBBBF
h|<<<
kXVVV
:4QRRRT""Dy kq} &MUE
 
 
 	XT]XX;XX	
 	
 	
 q1r   c                 d   t          j        dd          }|                    ddd           |                    d           |                    |           } | j        rt          t                     d	S | j        r3t          | j        dd
          }t          d| j         d|            d	S dS )NlddFr)  r,  r-  r.  r/  r   r   T)r	  r
  z"Shared libs used (recursively) by r5  ro   )	r6  r7  r8  r9  r3  r:  	LDD_USAGEr   r  r<  s      r   r@  r@    s    $%%@@@F
h|<<<

###T""Dy iq} &MUD
 
 
 	V4=VVVVWWWq1r   c                   t          | dd         d d d                   D ]\  }}t          j        d|          rt          | d|z
  d           c S t          j        d|          rt	          | d|z
  d           c S t
          j                            |          rZt          |          x}s dS |t          k    rt          | d|z
  d           c S |t          k    rt	          dg| d|z
  d          R  c S dS )Nr   r   r  z.*ldd(?:$|\.exe|\.py)z.*otool(?:$|\.exe|\.py)ro   r  )	enumerater   r   r@  r(  rI   r   isfiler  rz  r   )argvidxprognamer   s       r   mainrH    s&   "4!9TTrT?33 5 5X8,h77 
	5QWYY((((X0(;; 	5$q3wyy/****W^^H%% 	5 .x 8 88H 5qqW$$DSO,,,,Y&&T4DSO4444441r   c            
     :   t           j        d         dk    rdd l} t           j        d         }|dk    r|dk    rt          rd}nd}d }d t           j        D             }t	          |          r=|d                             d          \  }t          j                            |          }nd	}|dk    rB| 	                    t          |d
d
          }t          r| 	                    t                    }d}nG|dk    rA| 	                    t          |dd          }t          r| 	                    t                    }d}t          j        |dz   |z             }d |D             }|D ]}t          d|             ||          }	|r ||          }
n|	}
t          d                    |	                     t#          |	          t#          |
          k    s-J d| dt#          |	           dt#          |
                       d S t%          t           j                  S )Nro   testr   r   r(  r@  c                b    g | ],}t          j        d |          t          j        d |          -S )z--sysroot=([^ ]+))r   r   )r   args     r   r   z#main_maybe_test.<locals>.<listcomp>  sH     
 
 
x+S11
H(#..
 
 
r   r  r   F)r   r	  r
  dylibTr   z/usr/lib/*.c                    g | ]T}t           j                            |          r1t           j                            t          j        |                    R|US r   )rI   r   islinkr   readlink)r   r   s     r   r   z#main_maybe_test.<locals>.<listcomp>  s^     
 
 
7>>(++
 02w~~bk(>S>S/T/T

 
 
r   z

checking 
zpy-ldd result incorrect for z, this:
z

vs that:
)r  rE  	functoolsr	   r*   r  rI   r   
expanduserpartialr  r  r   r&  globr:  r   r  rH  )rR  tool	test_thatsysroot_argsr   	test_thisSOEXT	codefilesr   thisthats              r   main_maybe_testr^    sy   
x{fx{7??tu}} 	
 
x
 
 

 | 	%b)0033JWg((11GGG7??!)) "'	 *  I  F%--.DEE	EEU]]!)) 'TSW *  I  D%--.BCC	E Ig5=>>	
 
%
 
 
	
 " 
	d 
	dH***+++9X&&D  y**$))D//"""D		SYY&&&chccTccX[\`XaXacc '&&&
	d 
	d CH~~r   __main__)ro   )r   )r   Nr   N)F)r   r  r  r  r  r  )r   r  )TTr   r  )r  )
__future__r   r6  rU  loggingrI   r   rs   r  pathlibr   utilsr   r   r   r	   r
   basicConfigINFOrA  r;  r   r   r   r   r   r   r   LC_ID_DYLIBLC_LOAD_DYLIBLC_LOAD_WEAK_DYLIBLC_LOAD_UPWARD_DYLIBLC_REEXPORT_DYLIBLC_LAZY_LOAD_DYLIBr}   r|   r   version_infomajverr.   r   	Exceptionr   r!   r3   rV   rx   r   r   r   r   r   r   r   r   r   r   r   r<  E_TYPE_RELOCATABLEE_TYPE_EXECUTABLEE_TYPE_SHAREDE_TYPE_COREE_MACHINE_UNSPECIFIEDE_MACHINE_SPARCE_MACHINE_X86E_MACHINE_MIPSE_MACHINE_POWERPCE_MACHINE_ARME_MACHINE_SUPERHE_MACHINE_IA_64E_MACHINE_X86_64E_MACHINE_AARCH64E_MACHINE_RISC_VPT_NULLr  
PT_DYNAMICr  PT_NOTEPT_SHLIBPT_PHDRPT_LOOS	PT_LOPROC	PT_HIPROCPT_GNU_EH_FRAMEPT_GNU_STACKPT_GNU_RELROSHT_PROGBITS
SHT_SYMTABrb  SHT_RELASHT_HASHrs  SHT_NOTE
SHT_NOBITSSHT_REL	SHT_SHLIB
SHT_DYNSYMSHT_INIT_ARRAYSHT_FINI_ARRAYSHT_PREINIT_ARRAY	SHT_GROUPSHT_SYMTAB_SHNDXSHT_NUMSHT_LOOS	SHF_WRITE	SHF_ALLOCSHF_EXECINSTR	SHF_MERGESHF_STRINGSSHF_INFO_LINKSHF_LINK_ORDERSHF_OS_NONCONFORMING	SHF_GROUPSHF_TLS
SHF_MASKOSSHF_MASKPROCSHF_ORDEREDSHF_EXCLUDEDT_NULLrt  DT_PLTRELSZ	DT_PLTGOTDT_HASHrw  	DT_SYMTABDT_RELA	DT_RELASZ
DT_RELAENTDT_STRSZ	DT_SYMENTDT_INITDT_FINIrx  ru  DT_SYMBOLICDT_RELDT_RELSZ	DT_RELENT	DT_PLTRELDT_DEBUG
DT_TEXTREL	DT_JMPRELDT_BIND_NOWDT_INIT_ARRAYDT_FINI_ARRAYDT_INIT_ARRAYSZDT_FINI_ARRAYSZrv  DT_LOOSDT_HIOS	DT_LOPROC	DT_HIPROCr3  rV  r  rz  r  r  r  r   r  r  r  r   r  r  r&  r(  r@  rH  r^  r   exitr   r   r   <module>r     sp   # " " " " "    				 				  



       E E E E E E E E E E E E E E  ', ' ' ' '*X	"R 	
     +		!		1	0i00	JGGC4J4J	 	 	 	 	Y 	 	 	1 1 1 1 1 1 1 1*: : : : : : : :z       6     $  
 
 
  (       O O O*      S2 S2 S2 S2l2 2 2< < < < < < < <F          

	


		I%""



	
 	 
			 	


		
		
	
	

				
	


		*
 *
 *
 *
 *
 *
 *
 *
Zz& z& z& z& z& z& z& z&z8 8 8 8 8 8 8 8>b b b b bn b b bJ    n   (    n   (C C C C C C C C
  
F 
F 
F 
F      D    ? ? ? ?D FN   4    
 
 
  (  "   > > >B zCH__ r   