summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Klose <doko@ubuntu.com>2009-01-10 17:08:25 (GMT)
committerMatthias Klose <doko@ubuntu.com>2009-01-10 17:08:25 (GMT)
commit2c7e3ee79b0a9bbcf0d67a3d788b31392e14dc15 (patch)
tree04e31698c9d6ed7a857023e64a3b90fae667547c
parent49956b26a276cdbe6c5ac1e6020ea5e944291558 (diff)
downloadcpython-2c7e3ee79b0a9bbcf0d67a3d788b31392e14dc15.zip
cpython-2c7e3ee79b0a9bbcf0d67a3d788b31392e14dc15.tar.gz
cpython-2c7e3ee79b0a9bbcf0d67a3d788b31392e14dc15.tar.bz2
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.
-rw-r--r--Lib/ctypes/util.py40
-rw-r--r--Misc/NEWS3
2 files changed, 39 insertions, 4 deletions
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index 29bc488..78f4ce3 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -89,20 +89,22 @@ elif os.name == "posix":
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)
try:
trace = f.read()
finally:
- f.close()
+ rv = f.close()
finally:
try:
os.unlink(ccout)
except OSError as 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
@@ -129,7 +131,13 @@ elif os.name == "posix":
# 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'
f = os.popen(cmd)
try:
data = f.read()
@@ -193,8 +201,32 @@ elif os.name == "posix":
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
diff --git a/Misc/NEWS b/Misc/NEWS
index d29fcf8..2a3ae12 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -236,6 +236,9 @@ Library
support unusual filenames (such as those containing semi-colons) in
Content-Disposition headers.
+- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
+ biarch systems. Try to rely on ldconfig only, without using objdump and gcc.
+
Tools/Demos
-----------