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.


Anmelden zum Antworten