Я пытаюсь обернуть функцию GLIBC fstat
(это может быть любой другой: это просто доказательство концепции), введя мою библиотеку в исполняемый файл. Я делаю это, поместив свою библиотеку, где указатель исполнителя указывает с именем libc.so.6
.Обтекание функции glibc с использованием динамического компоновщика
Исходный код моей библиотеки является один ниже:
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>
int fstat(int fd, struct stat *buf){
typeof(fstat) *old_fstat;
// Try with a printf...
printf("HOOT! fstat wrapped!");
old_fstat = dlsym(RTLD_NEXT, "fstat");
return (*old_fstat)(fd, buf);
}
я скомпилировать его с --version-script
(добавить символ управления версиями) и статически связать его с libgcc.
gcc -Wall -fPIC -c -o wrapperlib.o wrapperlib.c
gcc -shared -static-libgcc -fPIC -Wl,-soname -Wl,libc.so.6 -Wl,--version-script=wrapperlib.map,-Bstatic -o libc.so.6 wrapperlib.o
С wrapperlib.map
, содержащий:
GLIBC_2.0 {
};
Когда я исполняю целевую программу моя библиотека будет загружена, но я получаю следующее сообщение об ошибке:
./target: relocation error: ./target: symbol __libc_start_main, version GLIBC_2.0 not defined in file libc.so.6 with link time reference
Если я обеспечиваю свою собственную реализацию __libc_start_main
Я не получаю эту ошибку (но, конечно, сбой).
int __libc_start_main(int (*main) (int, char **, char **), int argc, char *argv, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void *stack_end) {
system("echo I am in __libc_start_main");
printf("printf: I am in __libc_start_main");
fflush(stdin);
return 0;
}
Почему возникает ошибка перемещения на __libc_start_main
и не на system
?
(Кстати, призыв к system
не делает работу, но вызов printf
не выводит Я пропускаю что-то очевидное здесь.?)
Спасибо
Edit: Запуск цели с LD_DEBUG=all
выходы это: http://pastebin.com/iVVbwf6n
Спасибо за ответ. Я не использую LD_PRELOAD, потому что все дело в том, чтобы обернуть вызов функции GLIBC с единственным использованием RPATH цели. Тем не менее, я не вижу, какая другая библиотека может удовлетворить этим символам: я отредактировал, чтобы включить вывод LD_DEBUG. – 0xdeda10
@mr_sparxx, я существенно пересмотрел и обновил ответ, заметив ваше замечание о том, что вы статически связываете libgcc, который я ранее забыл. –
Да, я имел в виду -lstatic-gcc (я отредактировал мой пост), и это было мое заблуждение, я попробую путь, который вы открыли при обновлении. – 0xdeda10