Programme Unix utilisant la mauvaise fonction des bibliothèques partagées

Je travaille à la refactorisation d’une suite d’anciens utilitaires et à la création d’un nouveau serveur qui utilisera le code commun de tous pour unifier leurs fonctionnalités et permettre un access externe par les clients distants. Pour chaque utilitaire, je prends le code dont j’ai besoin pour le serveur et le réorganise dans une bibliothèque partagée afin que l’utilitaire et le serveur se lient désormais à la bibliothèque partagée. En raison de la manière dont l’ancien développeur de ces utilitaires a fait les choses, ils ont tout simplement copié et collé tout ce dont ils avaient besoin pour créer un nouvel utilitaire, donc une tonne de fonctions ont la même signature (callback pour un parsingur XML) faire des choses différentes à l’intérieur

Lorsque je lance les utilitaires autonomes qui ont été restructurés pour être associés au code partagé, ils fonctionnent parfaitement. Lorsque j’essaie d’utiliser le serveur avec les mêmes fonctionnalités qu’un utilitaire donné, le serveur utilise le code de la première bibliothèque liée à la place de la bibliothèque à partir de laquelle il doit être fonctionnel.

Par exemple, j’ai XML pour les périphériques A, B, C qui sont analysés par une bibliothèque xml commune, mais chaque périphérique a sa propre bibliothèque partagée libA, libB, libC utilisée par le serveur. Lorsque j’appelle le serveur pour envoyer le fichier xml pour le périphérique C, il utilise la fonction ‘HandleStartElement’ de libA, au lieu de la fonction du même nom et de la même signature dans libC, même si les bibliothèques partagées ne déclarent que ces fonctions t partager les en-têtes qui mentionnent ces rappels internes pour parsingr le XML.

Quelqu’un peut-il m’expliquer pourquoi il ne lit pas la fonction appropriée et comment l’éviter à l’avenir?

Mon makefile pour le serveur comporte les indicateurs suivants pour la compilation du programme principal:

-I../include -L../lib -lA -lB -lC 

Chaque bibliothèque partagée n’utilise pas d’indicateurs pour la bibliothèque partagée et n’utilise pas -fPIC.

Lorsqu’elles sont utilisées avec les indicateurs -l , les bibliothèques partagées sont supposées fonctionner comme des bibliothèques non partagées et, en particulier, ne prendront pas en charge la présence de plusieurs fonctions portant le même nom. Vous êtes déjà un peu chanceux que le serveur fonctionne du tout.

Si je comprends bien votre problème, les fonctions qui portent le même nom ne sont pas destinées à être “vues” en dehors de la bibliothèque partagée. Une bibliothèque partagée possède une “table de symboles dynamic” qui répertorie les symboles exportés et importés par la bibliothèque partagée. Avec les outils GNU, vous pouvez voir son contenu avec nm -D libfoo.so . Les éditeurs de liens Unix traditionnels remplissent cette table de symboles en utilisant toutes les entités publiques des fichiers objects (à savoir static fonctions non static et les variables globales). Ce que vous voulez ici, c’est une construction plus contrôlée de cette table de symboles. Si votre code utilise des outils GNU (par exemple, vous utilisez Linux), vous voulez lire cet article , en particulier la section 2.2. Petite histoire: le format ELF prend en charge ce que vous recherchez, et il existe plusieurs outils / moyens d’y parvenir.

Cependant, à votre place, je développerais des scripts basés sur sed pour renommer les fonctions incriminées avec des noms uniques. Certaines actions de représailles sur les over-copy-pasters originaux peuvent également être en ordre.

Vous devriez utiliser -fPIC . Ne pas utiliser -fPIC pour les bibliothèques partagées sur certaines architectures est une erreur fatale. Comme votre code ne plante pas, je suppose que vous utilisez du matériel x86.