我试图使用LD_PRELOAD技术拦截libpthred(POSIX)函数调用。首先,我尝试创建自己的共享库,其名称与pthread库中的功能相同。下面是我自己创建的pthread_create函数的示例,该函数首先获取pthread库中原始pthread_create函数的地址,然后使用函数指针调用pthread库中的原始函数。
#include <stdio.h>
#include <dlfcn.h>
#include <pthread.h>
int pthread_create (pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void*), void *arg )
{
int return_value;
static int (*fptr) () = 0;
printf( "\n this is the test of LD_PRELOAD" );
char *lError = dlerror();
if( fptr == 0 )
{
fptr = ( int (*) () ) dlsym( RTLD_NEXT, "pthread_create" );
if( fptr == 0 )
{
(void) printf( "Error dlopen: %s", dlerror() );
return 0;
}
}
return (return_value);
}
我试图以这种方式编译它:
g++ -fPIC -g -rdynamic -c -Wall ldtest.C -lrt -lpthread -ldl
但它给出了以下错误
ldtest.C:26: error: too many arguments to function
第26行是程序中的这一行。
return_value = (*fptr)( thread, attr, start_routine, arg );
有人可以告诉我这里有什么问题或者这是编译它的正确方法吗?
答案 0 :(得分:1)
您发布的代码中没有这样的第26行。请发布相关的代码。
如果第26行中使用的fptr
与上面pthread_create
中的()
完全一致(即使用空参数列表()
),则代码将不会编译为C ++ ,因为在C ++中,fptr
作为参数列表意味着“根本没有参数”。而你试图传递参数,这是导致错误的原因。如果您希望代码以C ++的形式工作,请使用正确的参数列表声明()
。
使用{{1}}作为参数列表的声明将在C代码中起作用,因为在C中它表示“未指定的参数”,但不在C ++中。
答案 1 :(得分:0)
您已将fptr
声明为指向不带参数且返回int
的函数的指针。因此,当您尝试使用三个参数调用它时,gcc
会抱怨。
尝试使用正确的参数重新声明fptr
。