0

Cela peut être une question quelque peu méta car je pense que mon problème provient d'un manque de connaissances sur les bibliothèques partagées par rapport aux bibliothèques statiques.Segmentation Programme de fautes compilé dans la bibliothèque partagée mais pas statique

Je travaille sur un système serveur/client utilisant l'infiniband comme exercice d'apprentissage/préparation pour un programme de travail à venir. À l'origine, j'avais 2 exécutables, chacun d'entre eux inclus une partie du même code source, donc je les ai divisés en fichiers communs (étant RDMAConnectionManager.cpp et RDMAConnection.cpp avec leurs en-têtes). Quelque part le long de la ligne, j'ai décidé que je voulais que ces fichiers soient une bibliothèque afin que je puisse m'assurer que mon serveur et mon client utilisent le même code de niveau inférieur. J'ai toujours utilisé des bibliothèques partagées, donc je suis allé sur les choses selon la norme, en créant la bibliothèque partagée via cmake.

Le problème était, dès que je l'ai fait je recevrais une erreur de segmentation dans une fonction fournie par la bibliothèque rdmacm, en particulier avec ib_verbs fonctions. Je pensais que cela pourrait avoir quelque chose à voir avec l'ordre de liaison, mais rien que j'ai changé d'aide. Par simple caprice, je l'ai changé d'une bibliothèque SHARED à une bibliothèque STATIC. Cela a fonctionné parfaitement! Ma compréhension d'une statique était qu'elle incluait tous les symboles des bibliothèques qu'elle relie, contrairement à un partage. Cependant, maintenant que j'ai trouvé ce problème épineux, j'ai l'impression qu'il me manque quelque chose.

J'ai depuis fait plus de lecture et je me sens plus à l'aise avec les différences, mais je ne sais toujours pas ce qui a conduit à ce problème (ou comment le voir arriver dans le futur). Quelqu'un a-t-il une idée de ce qui pourrait arriver?

+0

Cela n'a pas fonctionné parfaitement. Vous avez déplacé des choses autour qui ont déguisé la segfault, mais elle est toujours là. Les bibliothèques partagées existent depuis 50 ans. RDMA a été autour de 10. Votre code a été autour pendant 2 jours. Que vous dit le rasoir d'Occam? – stark

+0

Vous pouvez peut-être vérifier avec 'ldd' que vous utilisez en fait la bibliothèque dynamique que vous prévoyez d'utiliser. –

Répondre

0

Vous devez clarifier la cause de SegFault, par exemple, exécutez votre programme avec gdb et identifiez l'emplacement de la segfault. Dans la plupart des cas, vous pouvez avoir des erreurs de mémoire, les erreurs de mémoire sont des problèmes très courants dans les applications natives et vous devriez les éviter. Mais pouvez-vous demander comment une erreur de mémoire va apparaître une SegFault dans quelques conditions. La réponse est sur la cartographie de la mémoire de votre programme, si changer le code (ajouter ou supprimer quelque chose) ou le compiler sous différents compilateurs ou avec des commutateurs différents, vous pouvez avoir différentes cartes mémoire. Par exemple, les versions de débogage ou de version, ou dans votre situation, la génération partagée ou statique peut différer dans le mappage de la mémoire du fichier binaire généré.

Alors, à quel point le mappage de la mémoire va-t-il provoquer SegFault? Si vous avez des problèmes de mémoire dans votre code comme un accès hors limite, une écriture invalide ou une lecture invalide, selon la carte mémoire de votre binaire, SegFault peut générer ou non, en fait, vous avez peut-être accédé à la zone réservée au tampon cet accès sortant tombe dans l'autre zone tampon ou mémoire que vous avez réservée et vous ne voyez pas de SegFaults (votre code a toujours des problèmes). Avec différentes générations, l'ordre des zones de mémoire ou le mappage de la mémoire peuvent changer et c'est pourquoi vous avez obtenu SegFault dans différentes versions.