Я пытаюсь перехватить вызовы функций 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 );
Может кто-нибудь сказать, пожалуйста, в чем здесь проблема? Или это правильный способ компиляции?