Почему при загрузке разделяемой библиотеки libc возникает ошибка «объект LibraryLoader не вызывается»?

1

Из https://en.wikipedia.org/wiki/Foreign_function_interface

модуль ctypes может загружать функции C из разделяемых библиотек /DLL на лету и автоматически переводить простые типы данных между семантикой Python и C следующим образом:

import ctypes
libc = ctypes.CDLL( '/lib/libc.so.6' )   # under Linux/Unix
t = libc.time(None)                      # equivalent C code: t = time(NULL)
print t

На Lubuntu 18.04

$ whereis libc
libc: /usr/lib/x86_64-linux-gnu/libc.a /usr/lib/x86_64-linux-gnu/libc.so /usr/share/man/man7/libc.7.gz

$ locate libc.so
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so

$ ls -l /usr/lib/x86_64-linux-gnu/libc.so
-rw-r--r-- 1 root root 298 Apr 16 16:14 /usr/lib/x86_64-linux-gnu/libc.so

Мне было интересно, почему при загрузке библиотеки libc shared библиотека имеет значение "Объект LibraryLoader" не вызывает ошибку?

$ python3 --version
Python 3.6.5

$ python3

>>> import ctypes
>>> libc=ctypes.cdll("/usr/lib/x86_64-linux-gnu/libc.so")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'LibraryLoader' object is not callable


>>> libc=ctypes.cdll("/lib/x86_64-linux-gnu/libc.so.6")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'LibraryLoader' object is not callable


>>> libc=ctypes.cdll("/lib/i386-linux-gnu/libc.so.6")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'LibraryLoader' object is not callable

См. Также https://unix.stackexchange.com/questions/449107/what-differences-and-relations-are-between-the-various-libc-so

Теги:
ctypes
dynamic-loading
libc

1 ответ

4
Лучший ответ

Вы cdll заблуждение нижний регистр cdll (который является LibraryLoader CDLL) с верхним регистром CDLL, который является конструктором для разделяемых библиотек.

Этот код будет работать так, как ожидалось:

libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")
  • 0
    Не лучше ли загрузить /lib/x86_64-linux-gnu/libc.so.6 ? В противном случае скрипту Python понадобятся пакеты разработки библиотеки C во время выполнения ...
  • 0
    @ StefhenKitt Я думаю, что это выходит за рамки вопроса. Речь идет о том, как правильно загрузить библиотеку, а не о том, какая из них лучше.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню