[Python-checkins] r68490 - in python/branches/release26-maint: Lib/ctypes/util.py Misc/NEWS

matthias.klose python-checkins at python.org
Sat Jan 10 18:11:12 CET 2009


Author: matthias.klose
Date: Sat Jan 10 18:11:11 2009
New Revision: 68490

Log:
Merge r68487 from svn+ssh://pythondev@svn.python.org/python/trunk:

- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
  biarch systems. Try to rely on ldconfig only, without using objdump and gcc.


Modified:
   python/branches/release26-maint/Lib/ctypes/util.py
   python/branches/release26-maint/Misc/NEWS

Modified: python/branches/release26-maint/Lib/ctypes/util.py
==============================================================================
--- python/branches/release26-maint/Lib/ctypes/util.py	(original)
+++ python/branches/release26-maint/Lib/ctypes/util.py	Sat Jan 10 18:11:11 2009
@@ -92,18 +92,20 @@
         expr = r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)
         fdout, ccout = tempfile.mkstemp()
         os.close(fdout)
-        cmd = 'if type gcc >/dev/null 2>&1; then CC=gcc; else CC=cc; fi;' \
+        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
         try:
             f = os.popen(cmd)
             trace = f.read()
-            f.close()
+            rv = f.close()
         finally:
             try:
                 os.unlink(ccout)
             except OSError, e:
                 if e.errno != errno.ENOENT:
                     raise
+        if rv == 10:
+            raise OSError, 'gcc or cc command not found'
         res = re.search(expr, trace)
         if not res:
             return None
@@ -125,7 +127,13 @@
             # assuming GNU binutils / ELF
             if not f:
                 return None
-            cmd = "objdump -p -j .dynamic 2>/dev/null " + f
+            cmd = 'if ! type objdump >/dev/null 2>&1; then exit 10; fi;' \
+                  "objdump -p -j .dynamic 2>/dev/null " + f
+            f = os.popen(cmd)
+            dump = f.read()
+            rv = f.close()
+            if rv == 10:
+                raise OSError, 'objdump command not found'
             res = re.search(r'\sSONAME\s+([^\s]+)', os.popen(cmd).read())
             if not res:
                 return None
@@ -171,8 +179,32 @@
                     return None
             return res.group(0)
 
+        def _findSoname_ldconfig(name):
+            import struct
+            if struct.calcsize('l') == 4:
+                machine = os.uname()[4] + '-32'
+            else:
+                machine = os.uname()[4] + '-64'
+            mach_map = {
+                'x86_64-64': 'libc6,x86-64',
+                'ppc64-64': 'libc6,64bit',
+                'sparc64-64': 'libc6,64bit',
+                's390x-64': 'libc6,64bit',
+                'ia64-64': 'libc6,IA-64',
+                }
+            abi_type = mach_map.get(machine, 'libc6')
+
+            # XXX assuming GLIBC's ldconfig (with option -p)
+            expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \
+                   % (abi_type, re.escape(name))
+            res = re.search(expr,
+                            os.popen('/sbin/ldconfig -p 2>/dev/null').read())
+            if not res:
+                return None
+            return res.group(1)
+
         def find_library(name):
-            return _get_soname(_findLib_ldconfig(name) or _findLib_gcc(name))
+            return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name))
 
 ################################################################
 # test code

Modified: python/branches/release26-maint/Misc/NEWS
==============================================================================
--- python/branches/release26-maint/Misc/NEWS	(original)
+++ python/branches/release26-maint/Misc/NEWS	Sat Jan 10 18:11:11 2009
@@ -114,6 +114,9 @@
 
 - FileIO's mode attribute now always includes ``"b"``.
 
+- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
+  biarch systems. Try to rely on ldconfig only, without using objdump and gcc.
+
 Extension Modules
 -----------------
 


More information about the Python-checkins mailing list