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