在ctypes
周围是否有Python包装器或ctypes
的替代品在某种程度上了解链接描述文件?
在我的计算机上(Ubuntu Xenial 16.04),libc.so
是一个链接描述文件,如下所示。
$ cat /usr/lib/x86_64-linux-gnu/libc.so
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )
与到libc.so.6
的符号链接相比,我不确定该脚本为您提供了什么功能,但是我假设您需要它来实际生成有效的可执行文件。
内置的python ctypes
模块不了解链接描述文件,正确地抱怨共享对象的格式错误。
$ python3 foo.py
Traceback (most recent call last):
File "foo.py", line 5, in <module>
libc = ctypes.CDLL("libc.so")
File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/x86_64-linux-gnu/libc.so: invalid ELF header
来源:
# foo.py
import ctypes
libc = ctypes.CDLL("libc.so")
print(libc.strcmp("abc", "def"));
但是,直接导入"libc.so.6"
可以正常工作。 strcmp
在这里返回-3。有点奇怪,但是我认为这只是某个地方的签名不匹配。
$ python3 foo2.py
-3
来源:
# foo2.py
import ctypes
libc = ctypes.CDLL("libc.so.6")
print(libc.strcmp("abc", "def"));