[ctypes-users] ctypes.util.test() fails: _dlopen does not handle ld scripts
Brought to you by:
theller
From: Sebastian M. E. <er...@pl...> - 2017-06-29 19:44:20
|
Hi all, the test routine in ctypes.util fails - across multiple Python versions. I am studying ctypes code to better understand it and found it this way. The problem occurs in CPython 2.7, 3.4 and 3.6(.1) - I attached two examples below this email. The error is identical: OSError: /usr/lib64/libm.so: invalid ELF header I am running openSUSE Leap 42.2. Looking deeper, my libm.so does not have an ELF header. In my case, it happens to be an ASCII file with the following contents: /* GNU ld script */ OUTPUT_FORMAT(elf64-x86-64) GROUP ( /lib64/libm.so.6 AS_NEEDED ( /usr/lib64/libmvec_nonshared.a /lib64/libmvec.so.1 ) ) I am bit surprised as I have not seen this concept before. For my understanding: Is the (in-)correct handling of ld scripts a bug or simply a missing feature in ctypes? Could it be solved within ctypes (instead of writing workaround code on the application side)? There are some fairly old discussions on ctypes mailing lists, like this one, 14 years old, describing this very behavior: https://sourceforge.net/p/ctypes/mailman/message/4444162/ Thanks, Sebastian -------------------- Python 2.7.13 (default, Mar 22 2017, 12:31:17) [GCC] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from ctypes import util >>> util.test() libm.so.6 libc.so.6 libbz2.so.1 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/ctypes/util.py", line 303, in test print cdll.LoadLibrary("libm.so") File "/usr/lib64/python2.7/ctypes/__init__.py", line 440, in LoadLibrary return self._dlltype(name) File "/usr/lib64/python2.7/ctypes/__init__.py", line 362, in __init__ self._handle = _dlopen(self._name, mode) OSError: /usr/lib64/libm.so: invalid ELF header Python 3.4.6 (default, Mar 22 2017, 12:26:13) [GCC] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from ctypes import util >>> util.test() libm.so.6 libc.so.6 libbz2.so.1 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python3.4/ctypes/util.py", line 262, in test print(cdll.LoadLibrary("libm.so")) File "/usr/lib64/python3.4/ctypes/__init__.py", line 429, in LoadLibrary return self._dlltype(name) File "/usr/lib64/python3.4/ctypes/__init__.py", line 351, in __init__ self._handle = _dlopen(self._name, mode) OSError: /usr/lib64/libm.so: invalid ELF header |