[LINUX] dlopen () ltrace un appel de fonction dans une bibliothèque partagée

TLDR

** Histoire à x86_64. Non confirmé dans d'autres architectures. ** **

Vous pouvez utiliser la commande ltrace pour tracer les appels aux fonctions dans une bibliothèque partagée. Cependant, dire simplement ltrace a.out tracera les appels de fonction dans la bibliothèque spécifiée au moment de la construction, comme -lhoge, mais pas les appels de fonction dans la bibliothèque qui était dlopen (). Pour ce faire, vous devez spécifier le nom de la fonction, tel que ltrace -x hoge a.out.

Exemple

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;
}

Exécutez ltrace a.out

L'appel à hoge () n'est pas affiché.

$ 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) +++

Exécutez ltrace -x hoge a .out

La ligne «[email protected] (5, 9, 1, 0) »s'affiche.

$ 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) +++

Commentaire

Il semble que le support dlopen () de ltrace ait été implémenté vers 2009. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=537781 Le patch original et son explication se trouvent sur cette page. http://timetobleed.com/extending-ltrace-to-make-your-rubypythonperlphp-apps-faster/

Recommended Posts

dlopen () ltrace un appel de fonction dans une bibliothèque partagée
Créer une fonction en Python
Comment appeler une fonction
Python --Fonction d'appel dynamique à partir d'une chaîne
Une histoire sur une erreur de construction dans une bibliothèque partagée qui fait référence à libusb
Dessiner un graphique d'une fonction quadratique en Python
Créer une bibliothèque de mutations de séquences protéiques avec des pandas
Appel de scripts Python à partir de Python intégré en C ++ / C ++
[Go] Comment écrire ou appeler une fonction
Comment se moquer d'une fonction publique dans Pytest
Dualité en fonction
Ceci est un exemple d'application de fonction dans dataframe.
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Publier / télécharger une bibliothèque créée en Python vers PyPI
[Redash] La bibliothèque standard ne peut pas être utilisée dans la fonction python
Que signifie le dernier () dans une fonction en Python?