gpt4 book ai didi

编译 LD_PRELOAD 包装器的冲突类型

转载 作者:行者123 更新时间:2023-12-03 21:42:07 35 4
gpt4 key购买 nike

我尝试使用 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com