Как обернуть математическую функцию glib c с помощью LD_PRELOAD - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь обернуть математические функции GLIB C, включая суммирование, деление, умножение, косинус, логарифм и др. c. Я нашел похожий пост здесь .

Я создал сценарий-оболочку для функции log, в которой что-то печатает перед расчетом. Примерно так для функции log:

#include <dlfcn.h>
#include <stdio.h>
#include <math.h>

static double (*real_log)(double dbl);

double log(double dbl)
{
    printf("value is %0.16f\n" , dbl);
    real_log = dlsym(RTLD_NEXT, "log");
    real_log(dbl);
}

И тестовый файл выглядит примерно так:

#include <stdio.h>
#include <math.h>

int main () {
    double var;
    var = log(2.7);
    printf("log is equal to %0.16f\n" , var);
    return 0;
}

Я перекомпилировал оболочку для создания общей библиотеки этим команда: gcc -fPIC -shared -o libpreload.so wrapper.c -ldl.

Я скомпилировал тестовый файл: gcc -fno-builtin-log test.c -o test -lm.

Затем я запускаю свой тестовый скрипт, используя: LD_PRELOAD=/path/to/libpreload.so ./test

Теперь выводится

value is 2.7000000000000002
log is equal to 0.0000000000000000

log возвращает нулевое значение, в то время как я ожидаю получить реальный расчет следующим образом:

value is 2.7000000000000002
log is equal to 0.9932517730102834

Я новичок в программировании C, а также Glib c функциональность. Буду признателен за любые идеи.

...