tags:

views:

64

answers:

2

Hello, I am trying to intercept libpthred( POSIX ) function calls using LD_PRELOAD technique. First I tried to create my own shared library having the same functin names as in the pthread library. Here is an example of my own created pthread_create function which first gets the address of original pthread_create function in the pthread library, then it calls the original function in the pthread library using the function pointer.

#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);
  }

I tried to compile it in this way:

g++ -fPIC -g -rdynamic -c -Wall ldtest.C -lrt -lpthread -ldl

But its giving the following error

ldtest.C:26: error: too many arguments to function

Line 26 is this line in the program.

return_value = (*fptr)( thread, attr, start_routine, arg );

Can anyone please tell me what is the problem here Or is this the right way to compile it?

A: 

You've declared fptr as a pointer to a function that takes no arguments and returns an int. Thus, gcc complains when you try calling it with three arguments.

Try redeclaring fptr with the proper arguments.

Ben Karel
+1  A: 

There's no such line 26 in the code that you posted. Please, post relevant code.

If the fptr you use in line 26 is declared exactly as the one in your pthread_create above (i.e. with empty parameter list ()), then the code will not compile as C++, since in C++ the () as parameter list means "no parameters at all". And you are trying to pass arguments, which is what causes the error. Declare fptr with the proper parameter list if you want your code to work as C++.

The declaration with () as parameter list will work in C code, since in C it means "unspecified parameters", but not in C++.

AndreyT