выборочный вызов, чтобы написать оболочку - PullRequest
0 голосов
/ 27 июня 2011

Я перехватил функцию библиотеки записи для перенаправления записей, но хочу, чтобы только несколько операций записи выполнялось для оболочки, тогда как другие (используемые для записи в сокеты) должны перейти к исходной функции libc. Пробовал использовать dlsym, но, похоже, не работает.

использовали переменную среды LD-PRELOAD

Буду признателен за помощь

Правка: Часть кода

int call_execute()
{
.....
    static ssize_t (*real_write)(int,const void*,size_t) = NULL;
...

    real_write= (size_t(*)(int,const void*,size_t)dlsym(RTLD_NEXT,"write");

...
    real_write(sockfd,argcalls[i],strlen(argcalls[i]));

}

Ответы [ 2 ]

1 голос
/ 27 июня 2011
#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h>

typedef ssize_t (*readf)(int, void *, size_t);

ssize_t
read(int fd, void *buf, size_t count) {
    readf p = dlsym(RTLD_NEXT, "read");
    printf("passing read with %d bytes\n", count);
    return p(fd, buf, count);
}

$ gcc -W -Wall -shared -o /tmp/libpre.so test.c -ldl

$ env LD_PRELOAD = / tmp / libpre.so cat / dev / null

Выше должно выдать результат, подобный этому:

прохождение чтения с 32768 байтами

0 голосов
/ 17 февраля 2014

Если dlsym(RTLD_NEXT, "write") не возвращает функцию libc, вы можете явно указать желаемую библиотеку, например,

void *handle = dlopen("libc.so.6", RTLD_LAZY);
if (!handle) puts(dlerror()), exit(1);
typeof(&write) real_write = dlsym(handle, "write");

- но, возможно, проще, если бы вы не использовали LD_PRELOAD всначала определите вашу оболочку записи в основной программе - тогда RTLD_NEXT должен работать.

...