Я попытался использовать LD_PRELOAD для перехвата функции sprintf
, поэтому я напечатаю в файл результат буфера:
#define _GNU_SOURCE
#include <stdio.h>
#include<dlfcn.h>
int sprintf (char * src , const char * format , char* argp)
{
int (*original_func)(char*,const char * , char*);
original_func = dlsym(RTLD_NEXT,"sprintf");
int ret = (*original_func)(src ,format,argp);
FILE* output = fopen("log.txt","a");
fprintf(output,"%s \n",src);
fclose(output);
return ret;
}
Когда я компилирую этот код gcc -Wall -fPIC -shared -o my_lib.so test_ld.c -ldl
у меня ошибка
test_ld.c:5:5: error: conflicting types for ‘sprintf’
int sprintf (char * src , const char * format , char* argp)
^
In file included from test_ld.c:2:0:
/usr/include/stdio.h:364:12: note: previous declaration of ‘sprintf’ was here
extern int sprintf (char *__restrict __s,
Как я могу это исправить?
int sprintf(char *restrict s, const char *restrict format, ...)
. Я не уверен, нужны ли ключевые словаrestrict
, ноsprintf
принимает varargs в качестве третьего аргумента, а не указатель. - person Paul Hankin   schedule 05.04.2021