[LINUX] dlopen () Verfolgt einen Funktionsaufruf in einer gemeinsam genutzten Bibliothek

TLDR

** Geschichte bei x86_64. In anderen Architekturen nicht bestätigt. ** **.

Mit dem Befehl ltrace können Sie Aufrufe von Funktionen in einer gemeinsam genutzten Bibliothek verfolgen. Wenn Sie jedoch einfach "ltrace a.out" sagen, werden die Funktionsaufrufe in der zum Zeitpunkt der Erstellung angegebenen Bibliothek wie "-lhoge" verfolgt, die Funktionsaufrufe in der Bibliothek "dlopen ()" jedoch nicht. Dazu müssen Sie den Funktionsnamen angeben, z. B. "ltrace -x hoge a.out".

Beispiel

hoge.c


// gcc -W -Wall -fPIC -shared hoge.c -o libhoge.so
int hoge(int a, int b)
{
    return 10 + a * b;
}

main.c


// gcc -W -Wall -ldl main.c -o a.out
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main()
{
    void* lib = dlopen("./libhoge.so", RTLD_LAZY);
    if (lib == NULL) {
        printf("%s\n", dlerror());
        exit(1);
    }

    int (*f)(int, int);
    f = (int (*)(int, int))dlsym(lib, "hoge");
    int x = f(5, 9);
    printf("x = %d\n", x);

    dlclose(lib);
    return 0;
}

Führen Sie ltrace a.out aus

Der Aufruf von hoge () wird nicht angezeigt.

$ ltrace ./a.out
dlopen("./libhoge.so", 1)                                                                 = 0x55cd42d67280
dlsym(0x55cd42d67280, "hoge")                                                             = 0x7f0bc72cc5aa
printf("x = %d\n", 55x = 55
)                                                                    = 7
dlclose(0x55cd42d67280)                                                                   = 0
+++ exited (status 0) +++

Führen Sie ltrace -x hoge a .out aus

Die Zeile [email protected] (5, 9, 1, 0) wird angezeigt.

$ ltrace -x hoge ./a.out
dlopen("./libhoge.so", 1)                                                                 = 0x564a38c5d280
dlsym(0x564a38c5d280, "hoge")                                                             = 0x7f8ffa51b5aa
[email protected](5, 9, 1, 0)                                                               = 55
printf("x = %d\n", 55x = 55
)                                                                    = 7
dlclose(0x564a38c5d280)                                                                   = 0
+++ exited (status 0) +++

Kommentar

Es scheint, dass die Unterstützung von ltrace für dlopen () um 2009 implementiert wurde. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=537781 Der Original-Patch und seine Erklärung finden Sie auf dieser Seite. http://timetobleed.com/extending-ltrace-to-make-your-rubypythonperlphp-apps-faster/

Recommended Posts

dlopen () Verfolgt einen Funktionsaufruf in einer gemeinsam genutzten Bibliothek
Erstellen Sie eine Funktion in Python
So rufen Sie eine Funktion auf
Python - Dynamische Aufruffunktion von String
Eine Geschichte über einen Erstellungsfehler in einer gemeinsam genutzten Bibliothek, die auf libusb verweist
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Erstellen Sie eine Proteinsequenz-Mutationsbibliothek mit Pandas
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
[Go] So schreiben oder rufen Sie eine Funktion auf
Wie man eine öffentliche Funktion in Pytest verspottet
Dualität in der Funktion
Dies ist ein Beispiel für eine Funktionsanwendung im Datenrahmen.
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Veröffentlichen / Hochladen einer in Python erstellten Bibliothek in PyPI
[Redash] Die Standardbibliothek kann nicht in der Python-Funktion verwendet werden
Was bedeutet das letzte () in einer Funktion in Python?