2010-01-28 4 views
0

J'essaye d'intercepter des appels de fonctions libpthred (POSIX) en utilisant la technique LD_PRELOAD. J'ai d'abord essayé de créer ma propre bibliothèque partagée ayant les mêmes noms de functin que dans la bibliothèque pthread. Voici un exemple de ma propre fonction pthread_create créée qui obtient d'abord l'adresse de la fonction pthread_create d'origine dans la bibliothèque pthread, puis elle appelle la fonction d'origine dans la bibliothèque pthread en utilisant le pointeur de fonction.Quelle est l'erreur dans mon programme?

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

J'ai essayé de le compiler ainsi:

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

Mais ses dons l'erreur suivante

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

ligne 26 est cette ligne dans le programme. Est-ce que quelqu'un peut me dire quel est le problème ici Ou est-ce la bonne façon de le compiler?

Répondre

0

Vous avez déclaré fptr comme pointeur vers une fonction qui ne prend aucun argument et renvoie un int. Ainsi, gcc se plaint lorsque vous essayez de l'appeler avec trois arguments.

Essayez de redéclarer fptr avec les arguments appropriés.

1

Il n'existe aucune ligne 26 dans le code que vous avez publié. S'il vous plaît, postez pertinent code.

Si le fptr que vous utilisez dans la ligne 26 est déclarée exactement comme celui de votre pthread_create ci-dessus (avec liste des paramètres vide ()), le code ne sera pas compilé en C++, car en C++ la () liste des paramètres signifie " pas de paramètres du tout ". Et vous essayez de passer des arguments, qui est la cause de l'erreur. Déclarez fptr avec la liste de paramètres appropriée si vous voulez que votre code fonctionne en C++.

La déclaration avec () comme liste de paramètres fonctionnera en code C, car en C, elle signifie "paramètres non spécifiés", mais pas en C++.

Questions connexes