Я взламывал printf() glibc в одном из своих проектов и столкнулся с проблемой. Не могли бы вы дать некоторые подсказки? И меня беспокоит то, почему то же самое решение для malloc/free работает идеально!
Как прилагается, «PrintfHank.c» содержит мое собственное решение printf(), которое будет предварительно загружено перед стандартной библиотекой; а «main.c» просто выводит предложение с помощью printf(). После редактирования двух файлов я выполнил следующие команды:
- скомпилировать main.c gcc –Wall –o main main.c
- создать мою собственную библиотеку gcc –Wall –fPIC –shared –o PrintfHank.so PrintfHank.c –ldl
- протестировать новую библиотеку LD_PRELOAD="$mypath/PrintfHank.so" $mypath/main
Но я получил в консоли «hello world» вместо «in my own printf». При взломе функций malloc/free все в порядке.
Я вхожу в свою систему как «root» и использую 2.6.23.1-42.fc8-i686. Любые комментарии будут высоко оценены!
main.c
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
PrintfHank.c
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdio.h>
#include <dlfcn.h>
static int (*orig_printf)(const char *format, ...) = NULL;
int printf(const char *format, ...)
{
if (orig_printf == NULL)
{
orig_printf = (int (*)(const char *format, ...))dlsym(RTLD_NEXT, "printf");
}
// TODO: print desired message from caller.
return orig_printf("within my own printf\n");
}