sách gpt4 ai đã đi

编译 LD_PRELOAD 包装器的冲突类型

In lại 作者:行者123 更新时间:2023-12-03 21:42:07 36 4
mua khóa gpt4 Nike

我尝试使用 LD_PRELOAD 来 Hook sprintf function ,所以我将打印到缓冲区的结果:

#define _GNU_SOURCE
#include
#include

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,
我该如何解决?

1 Câu trả lời

您遇到的主要问题是 sprintf 的原型(prototype)和官方的不符。您的函数具有以下签名:

int sprintf (char * src , const char * format , char* argp);
虽然官方有:
int sprintf(char *str, const char *format, ...);
您需要更改您的函数才能拥有此签名。完成此操作后,您需要使用 va_list得到可变参数。然后你会用它来调用 vsprintf它采用这种类型的参数而不是使用 dlsym加载 sprintf .
#include 
#include

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/

36 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com