En utilisant libtool pour charger un nom de fonction en double à partir d'une bibliothèque partagée

StackOverflow https://stackoverflow.com/questions/1716472

  •  19-09-2019
  •  | 
  •  

Question

Je suis en train de créer une bibliothèque partagée « debug » (c.-à-.so ou .dll fichier) qui appelle une autre « vraie » bibliothèque partagée qui a la même API C que la bibliothèque de débogage (dans ce cas, à imiter le PKCS # 11 API). Cependant, je suis en cours d'exécution dans le pétrin où la carte de lien de la bibliothèque de débogage est entré en collision avec celle de la bibliothèque réelle et provoquant la bibliothèque de débogage pour appeler 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 du Posix, mais je voudrais comprendre si la même chose est possible à l'aide de libtool de GNU.

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 le réel bibliothèque partagée.

Je l'ai découvert qu'il est possible de contourner ce problème en utilisant la commande « dlmopen » au lieu de « dlopen » et dire dlmopen pour créer une nouvelle carte de liaison (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 (à savoir, je ne vois pas une fonction lt_dlmopen dans libtool).

Est-il possible de faire la même chose en utilisant les commandes de libtool - qui est, pour créer une nouvelle carte de lien lors du chargement de la nouvelle bibliothèque afin qu'elle ne pas entrer en collision avec la carte de lien de la bibliothèque de débogage

?
Était-ce utile?

La solution

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 les spécifiques à Solaris « dlmopen » en utilisant la fonction 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 soit RTLD_LOCAL ou RTLD_GLOBAL, ou le comportement est indéfini. Pour Solaris, le comportement est par défaut à RTLD_LOCAL.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top