我的程序中有什么错误?

时间:2010-01-28 19:30:25

标签: c++ g++

我试图使用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 );

有人可以告诉我这里有什么问题或者这是编译它的正确方法吗?

2 个答案:

答案 0 :(得分:1)

您发布的代码中没有这样的第26行。请发布相关的代码。

如果第26行中使用的fptr与上面pthread_create中的()完全一致(即使用空参数列表()),则代码将不会编译为C ++ ,因为在C ++中,fptr作为参数列表意味着“根本没有参数”。而你试图传递参数,这是导致错误的原因。如果您希望代码以C ++的形式工作,请使用正确的参数列表声明()

使用{{1}}作为参数列表的声明将在C代码中起作用,因为在C中它表示“未指定的参数”,但不在C ++中。

答案 1 :(得分:0)

您已将fptr声明为指向不带参数且返回int的函数的指针。因此,当您尝试使用三个参数调用它时,gcc会抱怨。

尝试使用正确的参数重新声明fptr