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
.
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;
}
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) +++
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) +++
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