Seite 1 von 1

Zugriff auf libc-Funktionen über ctypes

Verfasst: Dienstag 23. März 2010, 18:26
von flix
Ich will mittels ctypes Funktionen aus der Linux libc aufrufen. Ich hab' das gerade in einem Buch gelesen und finde die Idee ziemlich spannend. Nur leider funktionieren die Codebeispiele bei mir nicht.

Ich habe folgendes probiert:

Code: Alles auswählen

from ctypes import *
libc = cdll.LoadLibrary("libc.so")
Das soll mir ein Handle auf die libc geben, so dass ich die dort definierten Funktionen direkt aufrufen kann. Nur leider passiert Folgendes:

Code: Alles auswählen

>>> from ctypes import *
>>> libc = cdll.LoadLibrary("libc.so")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/libc.so: invalid ELF header
Liegt das an dem 32/64-Bit Gedöns?
Mein System ist ein 64-bit Ubuntu 9.04
(2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64 GNU/Linux)

Hat jemand eine Ahnung wie ich diese Bibliothek laden kann?

Verfasst: Dienstag 23. März 2010, 18:38
von snafu

Code: Alles auswählen

>>> from ctypes import CDLL
>>> from ctypes.util import find_library
>>> CDLL(find_library('c'))
<CDLL 'libc.so.6', handle b77dc7f8 at b7792b0c>

Verfasst: Mittwoch 24. März 2010, 13:28
von flix
Super, vielen Dank!!!

Wenn ich gewusst hätte, dass ich die libc.so.6 laden muss, hätte ich gleich danach gegrept. Mit cdll.LoadLibrary('/lib/libc.so.6') hat es dann nämlich auch direkt geklappt.

Verfasst: Mittwoch 24. März 2010, 13:33
von mkesper
find_library hat halt den Vorteil, dass du keinen festen Pfad verwendest (sollte die Lib unter /usr/lib liegen etc.)

Verfasst: Mittwoch 24. März 2010, 19:57
von snafu
Auch ich würde zu `find_library()` tendieren, wenn das Skript auf möglichst vielen Plattformen laufen soll. Nur bei Windows soll es Schwierigkeiten bei der Namensfindung geben, wobei ab Python 2.6 zumindest mit den gängien Bibliotheken `libc` und `libm` besser umgegangen wird:
Changed in version 2.6: Windows only: find_library("m") or find_library("c") return the result of a call to find_msvcrt().
Für alle anderen Fälle gilt leider:
On Windows, find_library() searches along the system search path, and returns the full pathname, but since there is no predefined naming scheme a call like find_library("c") will fail and return None.
Mit `libc` trifft das aber wie gesagt nicht mehr zu.

Re:

Verfasst: Mittwoch 12. Mai 2010, 02:18
von farid
snafu hat geschrieben:

Code: Alles auswählen

>>> from ctypes import CDLL
>>> from ctypes.util import find_library
>>> CDLL(find_library('c'))
<CDLL 'libc.so.6', handle b77dc7f8 at b7792b0c>
Danke. Das muss ich mir merken!