2009-11-11 6 views
2

J'essaie de créer une bibliothèque partagée 'debug' (ie, fichier .so ou .dll) qui appelle une autre 'vraie' bibliothèque partagée qui a le même C API comme bibliothèque de débogage (dans ce cas, pour émuler l'API PKCS # 11). Cependant, je rencontre des problèmes lorsque la carte de liens de la bibliothèque de débogage entre en collision avec celle de la bibliothèque réelle et que la bibliothèque de débogage appelle ses propres fonctions au lieu des fonctions correspondantes dans la bibliothèque réelle. J'ai trouvé une solution à ce problème en utilisant la commande POSIX dlmopen, mais je voudrais savoir si la même chose est possible en utilisant libtool de GNU.Utilisation de libtool pour charger un nom de fonction en double à partir d'une bibliothèque partagée

Sur mon système Solaris 10, le code suivant échoue l'affirmation lorsqu'une application de test lie statiquement à la bibliothèque de débogage:

#include <dlfcn.h> 
int MyFunctionName() { 
    int (*function_ptr)(); 
    void *handle = dlopen("realsharedlibrary.so", RTDL_LAZY); 
    *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName"); 
    ASSERT(function_ptr != MyFunctionName); // Fails 
    return (*function_ptr)(); 
} 

Dans ce cas, je reçois un pointeur de fonction à la « MyFunctionName » locale (dans la bibliothèque de débogage) au lieu de MyFunctionName dans la vraie bibliothèque partagée. J'ai découvert qu'il est possible de contourner ce problème en utilisant la commande 'dlmopen' au lieu de 'dlopen' et en demandant à dlmopen de créer un nouveau mappage de lien (avec le paramètre LM_ID_NEWLM) lors du chargement de la bibliothèque réelle:

int MyFunctionName() { 
    int (*function_ptr)(); 
    void *handle = dlmopen(LM_ID_NEWLM, "realsharedlibrary.so", RTDL_LAZY); 
    *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName"); 
    ASSERT(function_ptr != MyFunctionName); // succeeds 
    return function_ptr(); // call real function 
} 

Malheureusement, dlmopen ne semble pas être inclus dans libtool (c.-à-je ne vois pas une fonction lt_dlmopen dans libtool).

Est-il possible de faire la même chose en utilisant les commandes libtool - c'est-à-dire de créer un nouveau mappage lors du chargement de la nouvelle bibliothèque afin qu'elle ne soit pas en conflit avec la carte de débogage?

Répondre

1

Je ne l'ai pas trouvé un bon moyen d'utiliser libtool pour résoudre ce problème encore, mais il y a un moyen d'éviter la fonction spécifique Solaris « dlmopen » en utilisant dlopen avec ces drapeaux:

void *handle = dlopen("realsharedlibrary.so", RTLD_NOW | RTLD_GROUP | RTLD_LOCAL) 

Apparemment , le problème des collisions de symboles est résolu en utilisant RTLD_NOW au lieu de RTLD_LAZY et en ajoutant RTLD_GROUP. Le RTLD_LOCAL est là parce que POSIX nécessite l'utilisation de RTLD_LOCAL ou RTLD_GLOBAL, ou le comportement est indéfini. Pour Solaris, le comportement par défaut est RTLD_LOCAL.

La question ouverte, cependant, est de savoir s'il est possible de passer ces types de drapeaux à lt_dlopen.

Questions connexes