Ich versuche, einige Funktionen der Glibc, wie fopen, fread usw. zu nutzen. Aber in der Hook-Funktion, muss ich die gleiche Funktion wie in Glibc verwenden. Wie dies:
// this is my fopen
FILE *fopen(.....)
{
fopen(....);// this is glibc fopen
}
Ich habe eine Möglichkeit gefunden, dies mit dlsym zu tun, aber auf diese Weise muss ich alle Glibc-Funktionsaufrufe mit Wrappern ersetzen, die Glibc-Funktion mit dlsym aufrufen. Ich bin neugierig, ob es eine andere Möglichkeit gibt, die gleiche Aufgabe zu erledigen, ohne Wrapper-Funktionen zu kodieren. Ich habe das schon mal probiert:
fopen.c
....fopen(..)
{
myfopen(..);
}
myfopen.c
myfopen(..)
{
fopen(...);// glibc version
}
main.c
int main()
{
fopen(...);
}
$ gcc -c *.c
$ gcc -shared -o libmyopen.so myopen.o
$ gcc -o test main.o fopen.o libmyopen.so
Nach meinem Verständnis wird gcc von links nach rechts linken, wie in der Befehlszeile angegeben, so main.o wird fopen in fopen.o verwenden, fopen.o wird myfopen in libmyfopen.so verwenden, libmyfopen.so wird fopen in glibc verwenden. Aber wenn ich es ausführe, bekomme ich einen Segmentfehler, gdb zeigt, dass es einen wiederholten Aufruf von fopen und myfopen gibt. Ich bin ein wenig verwirrt. Kann jemand erklären, warum?