diff -ru Python-2.7.11/Lib/ctypes/__init__.py python-2.7.11.5/Lib/ctypes/__init__.py --- Python-2.7.11/Lib/ctypes/__init__.py 2015-12-05 19:46:56 +0000 +++ python-2.7.11.5/Lib/ctypes/__init__.py 2016-06-05 23:12:48 +0000 @@ -355,6 +355,18 @@ flags |= _FUNCFLAG_USE_ERRNO if use_last_error: flags |= _FUNCFLAG_USE_LASTERROR + if _sys.platform.startswith("aix"): + # adding RTLD_NOW is already 'forced' in Modules/_ctypes/callproc.c + # left here (as a comment) to remind it is required by AIX + # from _ctypes import RTLD_NOW - not until Python3.6 + # mode |= RTLD_NOW -- not documented, but added automatically by Modules/_ctypes/_ctypes.c + # When a string contains ".a(" and ends with ")", asin "libFOO.a(libFOO.so)" + # this is taken to be an archive(member) syntax for AIX, and the mode is adjusted + + if name and name.endswith(")") and name.rfind(".a(") > 0: + # from _ctypes import RTLD_MEMBER is not expected to be valid before Python3.6 + RTLD_MEMBER = 0x00040000 + mode |= RTLD_MEMBER class _FuncPtr(_CFuncPtr): _flags_ = flags Only in python-2.7.11.5/Lib/ctypes: __init__.pyc Only in python-2.7.11.5/Lib/ctypes: _aixutil.py Only in python-2.7.11.5/Lib/ctypes: _aixutil.pyc Only in python-2.7.11.5/Lib/ctypes: _endian.pyc diff -ru Python-2.7.11/Lib/ctypes/test/test_loading.py python-2.7.11.5/Lib/ctypes/test/test_loading.py --- Python-2.7.11/Lib/ctypes/test/test_loading.py 2015-12-05 19:46:56 +0000 +++ python-2.7.11.5/Lib/ctypes/test/test_loading.py 2016-06-08 20:24:12 +0000 @@ -27,6 +27,16 @@ CDLL(os.path.basename(libc_name)) self.assertRaises(OSError, CDLL, self.unknowndll) + @unittest.skipUnless(sys.platform.startswith ("aix"), + 'test specific to AIX') + def test_load_AIX_libc(self): + if (sys.maxsize < 2**32): + cdll.LoadLibrary("libc.a(shr.o)") + else: + cdll.LoadLibrary("libc.a(shr_64.o)") + self.assertRaises(OSError, cdll.LoadLibrary, "libc.so.6") + self.assertRaises(OSError, CDLL, self.unknowndll) + @unittest.skipUnless(libc_name is not None, 'could not find libc') @unittest.skipUnless(libc_name is not None and os.path.basename(libc_name) == "libc.so.6", @@ -38,7 +48,7 @@ self.assertRaises(OSError, cdll.LoadLibrary, self.unknowndll) def test_find(self): - for name in ("c", "m"): + for name in ("c", "m", "intl", "ssl"): lib = find_library(name) if lib: cdll.LoadLibrary(lib) diff -ru Python-2.7.11/Lib/ctypes/util.py python-2.7.11.5/Lib/ctypes/util.py --- Python-2.7.11/Lib/ctypes/util.py 2015-12-05 19:46:56 +0000 +++ python-2.7.11.5/Lib/ctypes/util.py 2016-06-11 14:11:09 +0000 @@ -71,7 +71,15 @@ def find_library(name): return name -if os.name == "posix" and sys.platform == "darwin": +if sys.platform.startswith("aix"): + # find .so members in .a files + # using dump loader header information + sys. + import ctypes._aixutil as aix + + def find_library(name): + return aix.find_library(name) + +elif os.name == "posix" and sys.platform == "darwin": from ctypes.macholib.dyld import dyld_find as _dyld_find def find_library(name): possible = ['lib%s.dylib' % name, @@ -256,6 +264,21 @@ print find_library("m") print find_library("c") print find_library("bz2") + if sys.platform.startswith("aix"): + # examples of working with AIX and versions, when available + print "find_library(\"c\") returns:", find_library("c") + print "find_library(\"libc\") returns:", find_library("libc") + print "find_library(\"libssl\") returns:", find_library("libssl") + # expectation is None:archive libssl64.a with member libssl64.so is non-standard + print "find_library(\"libssl64\") returns:", find_library("libssl64") + print "find_library(\"ssl\") returns:", find_library("ssl") + print "find_library(\"libiconv\") returns:", find_library("libiconv") + print "find_library(\"intl\") returns:", find_library("intl") + print "sudoers.so: ",(find_library("sudoers.so")) + print "sudoers.so: ",(cdll.LoadLibrary("sudoers.so")) + print "sudoers.so: ",(find_library("/opt/libexec/sudo/sudoers.so")) + print "sudo_util: ",(find_library("/opt/libexec/sudo/sudo_util")) + print "sudo_util: ",(find_library("sudo_util")) # getattr ## print cdll.m @@ -268,9 +291,16 @@ print cdll.LoadLibrary("libSystem.dylib") print cdll.LoadLibrary("System.framework/System") else: - print cdll.LoadLibrary("libm.so") - print cdll.LoadLibrary("libcrypt.so") print find_library("crypt") + if sys.platform.startswith("aix"): + # AIX returns different values for 32 and 64-bit looking for find_library("c"), etc. + print(cdll.LoadLibrary(find_library("c"))) + print(cdll.LoadLibrary(find_library("/usr/lib/libc"))) + print(cdll.LoadLibrary(find_library("/opt/libexec/sudo/sudoers.so"))) + print cdll.LoadLibrary(find_library("crypt")) + else: + print(cdll.LoadLibrary("libm.so")) + print cdll.LoadLibrary("libcrypt.so") if __name__ == "__main__": test()