diff -ru Python-2.7.11.0/Lib/ctypes/__init__.py python-2.7.11.4/Lib/ctypes/__init__.py --- Python-2.7.11.0/Lib/ctypes/__init__.py 2015-12-05 19:46:56.000000000 +0000 +++ python-2.7.11.4/Lib/ctypes/__init__.py 2016-05-31 20:50:34.000000000 +0000 @@ -355,6 +355,15 @@ 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 + if name and name.endswith(")"): + # from _ctypes import RTLD_MEMBER not until Python3.6 + RTLD_MEMBER = 0x00040000 + mode |= RTLD_MEMBER class _FuncPtr(_CFuncPtr): _flags_ = flags diff -ru Python-2.7.11.0/Lib/ctypes/util.py python-2.7.11.4/Lib/ctypes/util.py --- Python-2.7.11.0/Lib/ctypes/util.py 2015-12-05 19:46:56.000000000 +0000 +++ python-2.7.11.4/Lib/ctypes/util.py 2016-05-31 20:33:39.000000000 +0000 @@ -71,7 +71,16 @@ 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): + # print ("aix.find: ", 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 +265,12 @@ 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("aix.find_library(\"libssl\")", find_library("libssl")) + print("aix.find_library(\"ssl\")", find_library("ssl")) + print("aix.find_library(\"libiconv\")", find_library("libiconv")) + print("aix.find_library(\"intl\")", find_library("intl")) # getattr ## print cdll.m @@ -268,9 +283,14 @@ 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"): + # This is the syntax AIX returns when looking for find_library("c"), etc. + print(cdll.LoadLibrary("libc.a(shr.o)")) + print cdll.LoadLibrary("libcrypt.a(shr.o)") + else: + print(cdll.LoadLibrary("libm.so")) + print cdll.LoadLibrary("libcrypt.so") if __name__ == "__main__": test() diff -ru Python-2.7.11.0/Lib/ctypes/test/test_loading.py python-2.7.11.4/Lib/ctypes/test/test_loading.py --- Python-2.7.11.0/Lib/ctypes/test/test_loading.py 2015-12-05 19:46:56.000000000 +0000 +++ python-2.7.11.4/Lib/ctypes/test/test_loading.py 2016-05-31 21:05:46.000000000 +0000 @@ -27,6 +27,13 @@ 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): + cdll.LoadLibrary("libc.a(shr.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 +45,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)