代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

为什么加载libc共享库时会出现“libraryloader”对象不可调用的错误?

  •  1
  • Tim unnamed eng  · 技术社区  · 7 年前

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

    CyType模块可以从共享库/DLL加载C函数 动态地自动转换简单的数据类型 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
    

    卢布图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
    

    我想知道为什么加载LBC共享库有“‘图书馆加载器’对象是不可调用的”错误?

    $ 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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Aran-Fey Kevin    7 年前

    你把小写字母搞混了 cdll (这是一个 LibraryLoader )带大写 CDLL ,它是共享库的构造函数。

    此代码将按预期工作:

    libc = ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6")