可以处理链接程序脚本的Python ctypes包装器/替代方法

时间:2018-07-19 19:27:38

标签: python linker ctypes

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"));

0 个答案:

没有答案