в чем ошибка в моей программе? - PullRequest
0 голосов
/ 28 января 2010

Я пытаюсь перехватить вызовы функций libpthred (POSIX), используя технику LD_PRELOAD. Сначала я попытался создать свою собственную разделяемую библиотеку, имеющую те же имена функций, что и в библиотеке pthread. Вот пример моей собственной созданной функции pthread_create, которая сначала получает адрес исходной функции pthread_create в библиотеке pthread, затем вызывает исходную функцию в библиотеке 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 ]

1 голос
/ 28 января 2010

В указанном вами коде нет такой строки 26. Пожалуйста, напишите соответствующий код.

Если fptr, который вы используете в строке 26, объявлен точно так же, как и в вашем pthread_create выше (т.е. с пустым списком параметров ()), то код не будет компилироваться как C ++, поскольку в C ++ () как список параметров означает «нет параметров вообще». И вы пытаетесь передать аргументы, что является причиной ошибки. Объявите fptr с соответствующим списком параметров, если вы хотите, чтобы ваш код работал как C ++.

Объявление с () в качестве списка параметров будет работать в коде C, поскольку в C оно означает «неопределенные параметры», но не в C ++.

0 голосов
/ 28 января 2010

Вы объявили fptr как указатель на функцию, которая не принимает аргументов и возвращает int. Таким образом, gcc жалуется, когда вы пытаетесь вызвать его с тремя аргументами.

Попробуйте переопределить fptr с правильными аргументами.

...