LD_PRELOAD mit sqrt() ?
-
Ich versuche gerade, die sqrt() und recv() mittels LD_PRELOAD zu überschreiben.
Folgenden Source-Code verwende ich:
#define _GNU_SOURCE #include <dlfcn.h> #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <math.h> static double (*real_sqrt) (double x); static ssize_t (*real_recv) (int s, void *buf, size_t len, int flags); static void sqrt_recv_filter_initialize() __attribute__((constructor)); #define GET_FUNC(x) \ real_ ## x = dlsym(RTLD_NEXT, #x); \ if (!real_ ## x || real_ ## x == x) \ exit(255); static void sqrt_recv_filter_initialize() { GET_FUNC(sqrt); GET_FUNC(recv); } #undef GET_FUNC double sqrt(double __x) { printf("test1\n"); return 0; } ssize_t recv(int as, void *buf, size_t len, int flags) { printf("test2\n"); return 0; }
Mit recv() funktioniert das wunderbar, leider nicht mit sqrt.
Ich teste das ganze mit folgendem Code:#include <iostream> #include <math.h> #include <sys/socket.h> int main(void) { std::cout << sqrt(4) << std::endl; char tmp[30]; recv(5, tmp, 30, 0); }
Ich bekomme folgende Ausgabe:
$ env LD_PRELOAD=./sqrt_recv_filter.so ./test 2.000000 test2
Wie man sieht, wurde recv() erfolgreich ersetzt, sqrt() aber nicht.
Weiß jemand, woran das liegt?
-
Es kann sein das sqrt als builtin behandelt wird. Der Compiler ersetzt also den Aufruf zu sqrt direkt durch Maschinenbefehle.