web-dev-qa-db-fra.com

sortie du symbole nm t vs T dans une bibliothèque so partagée

J'ai ajouté une nouvelle fonction (Fuse_lowlevel_notify_inval_directory) dans la bibliothèque Fuse de l'espace utilisateur. La compilation et la création de libfuse.so est terminée sans erreur. Mais lorsque mon application essaie d'utiliser cette nouvelle fonction, l'éditeur de liens génère une erreur: référence non définie à `Fuse_lowlevel_notify_inval_directory 'collect2: ld a renvoyé 1 état de sortie

Quand j'ai vérifié avec nm

nm ../libfuse.so | grep inval
00000000000154ed T Fuse_invalidate
**000000000001e142 t Fuse_lowlevel_notify_inval_directory**
000000000001e26c T Fuse_lowlevel_notify_inval_entry
000000000001e1cb T Fuse_lowlevel_notify_inval_inode

T/t signifie que le symbole est présent dans la section de texte. s'il est en majuscule, le symbole est global (externe). Je soupçonne que c'est le problème. La nouvelle fonction ajoutée affiche t en minuscules tandis que d'autres fonctions plus anciennes ont des majuscules T. Une idée de ce que je pourrais faire de mal?

22
ashish

Une idée de ce que je pourrais faire de mal?

La fonction t est en effet locale à la bibliothèque. Cela peut se produire pour un certain nombre de raisons. Les plus probables sont:

  1. Vous avez déclaré la fonction static, ou
  2. Vous avez compilé la bibliothèque avec -fvisibility=hidden Et n'avez pas pas __attribure__((visibility("default"))) sur la fonction, ou
  3. Vous avez lié cette bibliothèque avec un script de version de l'éditeur de liens (c'est-à-dire avec l'indicateur --version-script=libfoo.version) Qui masque toutes les fonctions, sauf celles qui sont explicitement exportées, et vous n'avez pas ajouté votre fonction à cette liste.

    Voir ceci exemple d'utilisation de --version-script Pour limiter la visibilité des symboles.
24
Employed Russian