Que signifie exactement l’avertissement concernant le symbole caché référencé par DSO?

J’ai un problème pour relier une bibliothèque partagée avec g ++. Cela me donne un avertissement comme:

hidden symbol XXX in YYY is referenced by DSO /usr/lib/... 

J’ai lu des questions connexes sur des problèmes particuliers, mais je souhaite les comprendre dans leur ensemble: que signifie cet avertissement et quelle en est la cause:

  1. Qu’est-ce que DSO?
  2. Qu’est-ce qu’un symbole caché?
  3. Comment peut-il être référencé, si c’est caché?

    Qu’est-ce qu’un DSO?

    Un DSO est un object partagé dynamic ou, moins formellement, une bibliothèque partagée .

    Qu’est-ce qu’un symbole caché?

    Un symbole masqué est un symbole (c’est-à-dire le nom d’une fonction ou d’un object de données) qui a été compilé avec une liaison masquée , par exemple conformément à la déclaration (spécifique à GCC):

     int x __atsortingbute__ ((visibility ("hidden"))); 

    Si x est défini dans un DSO, la liaison dynamic ne peut pas le référencer à partir d’un DSO différent. L’éditeur de liens peut voir x (ce n’est pas static ), mais il n’est pas disponible pour la liaison dynamic . Documentation ici

    Comment peut-il être référencé, si c’est caché?

    Cela ne peut pas être, ce qui est ce que vous êtes averti. Par exemple, l’avertissement de linktime:

    Le symbole caché `stat ‘dans /usr/lib/libc_nonshared.a(stat.oS) est référencé par DSO

    vous dit qu’un DSO dans la liaison fait référence au symbole stat et que l’éditeur de liens peut localiser une définition de stat dans /usr/lib/libc_nonshared.a , mais (évidemment) cette définition ne figure pas dans le DSO qui la référence et ne peut pas être référencé à partir de ce DSO, car il est caché.

    Vous obtenez ce problème si le problème DSO n’a pas été généré correctement pour une utilisation en tant que DSO. Voir cet exemple et suivre les suivis pour la solution.

    Suite pour le suivi de OP

    Si le symbole masqué est déjà référencé par un DSO, alors pourquoi le problème est-il avec DSO?

    L’éditeur de lien dit:

    Le DSO X contient une référence au symbole S Je peux trouver une définition du symbole S est un autre module lié Y , mais cette définition ne sera pas disponible pour satisfaire la référence dans X manière dynamic (c’est- à- dire au moment de l’exécution ) car S a un lien masqué dans Y

    Je peux confirmer que le problème vient d’un object non partagé […] [mais] je ne masque pas explicitement ces symboles dans mon object non partagé.

    Vous n’avez peut-être pas explicitement marqué de symbole masqué dans l’object non partagé. Selon la construction, les symboles peuvent être masqués par défaut, sauf indication explicite contraire .

    Supposons que l’object non partagé est libnonshared.a et que le symbole prétendument caché est foo . Courir:

     objdump -t libnonshared.a 

    pour obtenir des informations sur les symboles dans libnonshared.a . Dans la sortie, recherchez l’entrée pour foo . .hidden -il la balise .hidden ? – par exemple

     0000000000000000 g F .text 000000000000000b .hidden foo 

    Cette entrée indique que foo est un symbole global (marqué g – c’est pourquoi l’éditeur de liens est capable de le voir), mais il est masqué pour les liens dynamics .

    Si cela s’avère être le cas, vous devez corriger la construction de libnonshared.a afin qu’elle ne cache pas foo . Si non, alors je suis perplexe.