NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

util.py (7178B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\ctypes\util.py
      2 import sys, os
      3 if os.name == 'nt':
      4 
      5     def _get_build_version():
      6         prefix = 'MSC v.'
      7         i = sys.version.find(prefix)
      8         if i == -1:
      9             return 6
     10         i = i + len(prefix)
     11         s, rest = sys.version[i:].split(' ', 1)
     12         majorVersion = int(s[:-2]) - 6
     13         minorVersion = int(s[2:3]) / 10.0
     14         if majorVersion == 6:
     15             minorVersion = 0
     16         if majorVersion >= 6:
     17             return majorVersion + minorVersion
     18 
     19 
     20     def find_msvcrt():
     21         version = _get_build_version()
     22         if version is None:
     23             return
     24         if version <= 6:
     25             clibname = 'msvcrt'
     26         else:
     27             clibname = 'msvcr%d' % (version * 10)
     28         import imp
     29         if imp.get_suffixes()[0][0] == '_d.pyd':
     30             clibname += 'd'
     31         return clibname + '.dll'
     32 
     33 
     34     def find_library(name):
     35         if name in ('c', 'm'):
     36             return find_msvcrt()
     37         for directory in os.environ['PATH'].split(os.pathsep):
     38             fname = os.path.join(directory, name)
     39             if os.path.isfile(fname):
     40                 return fname
     41             if fname.lower().endswith('.dll'):
     42                 continue
     43             fname = fname + '.dll'
     44             if os.path.isfile(fname):
     45                 return fname
     46 
     47 
     48 if os.name == 'ce':
     49 
     50     def find_library(name):
     51         return name
     52 
     53 
     54 if os.name == 'posix' and sys.platform == 'darwin':
     55     from ctypes.macholib.dyld import dyld_find as _dyld_find
     56 
     57     def find_library(name):
     58         possible = ['lib%s.dylib' % name, '%s.dylib' % name, '%s.framework/%s' % (name, name)]
     59         for name in possible:
     60             try:
     61                 return _dyld_find(name)
     62             except ValueError:
     63                 continue
     64 
     65 
     66 elif os.name == 'posix':
     67     import re, tempfile, errno
     68 
     69     def _findLib_gcc(name):
     70         expr = '[^\\(\\)\\s]*lib%s\\.[^\\(\\)\\s]*' % re.escape(name)
     71         fdout, ccout = tempfile.mkstemp()
     72         os.close(fdout)
     73         cmd = 'if type gcc >/dev/null 2>&1; then CC=gcc; elif type cc >/dev/null 2>&1; then CC=cc;else exit 10; fi;$CC -Wl,-t -o ' + ccout + ' 2>&1 -l' + name
     74         try:
     75             f = os.popen(cmd)
     76             try:
     77                 trace = f.read()
     78             finally:
     79                 rv = f.close()
     80 
     81         finally:
     82             try:
     83                 os.unlink(ccout)
     84             except OSError as e:
     85                 if e.errno != errno.ENOENT:
     86                     raise
     87 
     88         if rv == 10:
     89             raise OSError, 'gcc or cc command not found'
     90         res = re.search(expr, trace)
     91         if not res:
     92             return
     93         return res.group(0)
     94 
     95 
     96     if sys.platform == 'sunos5':
     97 
     98         def _get_soname(f):
     99             if not f:
    100                 return
    101             cmd = '/usr/ccs/bin/dump -Lpv 2>/dev/null ' + f
    102             f = os.popen(cmd)
    103             try:
    104                 data = f.read()
    105             finally:
    106                 f.close()
    107 
    108             res = re.search('\\[.*\\]\\sSONAME\\s+([^\\s]+)', data)
    109             if not res:
    110                 return
    111             return res.group(1)
    112 
    113 
    114     else:
    115 
    116         def _get_soname(f):
    117             if not f:
    118                 return
    119             cmd = 'if ! type objdump >/dev/null 2>&1; then exit 10; fi;objdump -p -j .dynamic 2>/dev/null ' + f
    120             f = os.popen(cmd)
    121             dump = f.read()
    122             rv = f.close()
    123             if rv == 10:
    124                 raise OSError, 'objdump command not found'
    125             f = os.popen(cmd)
    126             try:
    127                 data = f.read()
    128             finally:
    129                 f.close()
    130 
    131             res = re.search('\\sSONAME\\s+([^\\s]+)', data)
    132             if not res:
    133                 return
    134             return res.group(1)
    135 
    136 
    137     if sys.platform.startswith('freebsd') or sys.platform.startswith('openbsd') or sys.platform.startswith('dragonfly'):
    138 
    139         def _num_version(libname):
    140             parts = libname.split('.')
    141             nums = []
    142             try:
    143                 while parts:
    144                     nums.insert(0, int(parts.pop()))
    145 
    146             except ValueError:
    147                 pass
    148 
    149             return nums or [sys.maxint]
    150 
    151 
    152         def find_library(name):
    153             ename = re.escape(name)
    154             expr = ':-l%s\\.\\S+ => \\S*/(lib%s\\.\\S+)' % (ename, ename)
    155             f = os.popen('/sbin/ldconfig -r 2>/dev/null')
    156             try:
    157                 data = f.read()
    158             finally:
    159                 f.close()
    160 
    161             res = re.findall(expr, data)
    162             if not res:
    163                 return _get_soname(_findLib_gcc(name))
    164             res.sort(cmp=lambda x, y: cmp(_num_version(x), _num_version(y)))
    165             return res[-1]
    166 
    167 
    168     else:
    169 
    170         def _findLib_ldconfig(name):
    171             expr = '/[^\\(\\)\\s]*lib%s\\.[^\\(\\)\\s]*' % re.escape(name)
    172             f = os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')
    173             try:
    174                 data = f.read()
    175             finally:
    176                 f.close()
    177 
    178             res = re.search(expr, data)
    179             if not res:
    180                 cmd = 'ldd %s 2>/dev/null' % sys.executable
    181                 f = os.popen(cmd)
    182                 try:
    183                     data = f.read()
    184                 finally:
    185                     f.close()
    186 
    187                 res = re.search(expr, data)
    188                 if not res:
    189                     return
    190             return res.group(0)
    191 
    192 
    193         def _findSoname_ldconfig(name):
    194             import struct
    195             if struct.calcsize('l') == 4:
    196                 machine = os.uname()[4] + '-32'
    197             else:
    198                 machine = os.uname()[4] + '-64'
    199             mach_map = {'x86_64-64': 'libc6,x86-64',
    200              'ppc64-64': 'libc6,64bit',
    201              'sparc64-64': 'libc6,64bit',
    202              's390x-64': 'libc6,64bit',
    203              'ia64-64': 'libc6,IA-64'}
    204             abi_type = mach_map.get(machine, 'libc6')
    205             expr = '(\\S+)\\s+\\((%s(?:, OS ABI:[^\\)]*)?)\\)[^/]*(/[^\\(\\)\\s]*lib%s\\.[^\\(\\)\\s]*)' % (abi_type, re.escape(name))
    206             f = os.popen('/sbin/ldconfig -p 2>/dev/null')
    207             try:
    208                 data = f.read()
    209             finally:
    210                 f.close()
    211 
    212             res = re.search(expr, data)
    213             if not res:
    214                 return
    215             return res.group(1)
    216 
    217 
    218         def find_library(name):
    219             return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name))
    220 
    221 
    222 def test():
    223     from ctypes import cdll
    224     if os.name == 'nt':
    225         print cdll.msvcrt
    226         print cdll.load('msvcrt')
    227         print find_library('msvcrt')
    228     if os.name == 'posix':
    229         print find_library('m')
    230         print find_library('c')
    231         print find_library('bz2')
    232         if sys.platform == 'darwin':
    233             print cdll.LoadLibrary('libm.dylib')
    234             print cdll.LoadLibrary('libcrypto.dylib')
    235             print cdll.LoadLibrary('libSystem.dylib')
    236             print cdll.LoadLibrary('System.framework/System')
    237         else:
    238             print cdll.LoadLibrary('libm.so')
    239             print cdll.LoadLibrary('libcrypt.so')
    240             print find_library('crypt')
    241 
    242 
    243 if __name__ == '__main__':
    244     test()