我尝试使用 LD_PRELOAD 来 Hook sprintf
function ,所以我将打印到缓冲区的结果:
#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,
我该如何解决?
最佳答案
您遇到的主要问题是 sprintf
的原型(prototype)和官方的不符。您的函数具有以下签名:
int sprintf (char * src , const char * format , char* argp);
虽然官方有:int sprintf(char *str, const char *format, ...);
您需要更改您的函数才能拥有此签名。完成此操作后,您需要使用 va_list
得到可变参数。然后你会用它来调用vsprintf
它采用这种类型的参数而不是使用 dlsym
加载 sprintf
.#include <stdio.h>
#include <stdarg.h>
int sprintf (char * src , const char * format , ...)
{
va_list args;
va_start(args, format);
int ret = vsprintf(src, format, args);
va_end(args);
FILE* output = fopen("log.txt","a");
fprintf(output,"%s \n",src);
fclose(output);
return ret;
}
关于编译 LD_PRELOAD 包装器的冲突类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66951324/