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?
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
Vous pouvez peut-être vérifier avec 'ldd' que vous utilisez en fait la bibliothèque dynamique que vous prévoyez d'utiliser. –