web-dev-qa-db-fra.com

nm: "U" Le symbole n'est pas défini

Quand j'utilise l'une de mes bibliothèques:

nm libmylib.so 

Je reçois une ligne comme celle-ci

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

J'ai vérifié la page de manuel de nm et j'ai obtenu le symbole "U". Le symbole n'est pas défini. Que signifie vraiment un symbole non défini?

S'il est vraiment indéfini, pourquoi le signale-t-il?

46
bbazso

Un symbole non défini est un symbole que la bibliothèque utilise mais n'a été défini dans aucun des fichiers objet ayant servi à créer la bibliothèque.

Généralement, le symbole est défini dans une autre bibliothèque, qui doit également être liée à votre application. Sinon, le symbole n'est pas défini car vous avez oublié de créer le code définissant le symbole ou vous avez oublié d'inclure le fichier objet contenant ce symbole dans votre bibliothèque.

Dans votre cas, cela ressemble à un symbole de la bibliothèque C de votre implémentation, vous vous attendez donc à ce que cela ne soit pas défini dans votre propre bibliothèque. Il sera défini dans votre libc.so où que ce soit, éventuellement/usr/lib.

42
Troubadour

Décrypter cela pourrait se faire comme ceci: 

           U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

Veux dire:

    U->>> in your library its undefined

qu'est-ce qui n'est pas défini?

     _ZNSs4_Rep20_S_empty_rep_storageE

Où est-il susceptible de le trouver?

      GLIBCXX_3.4

Maintenant pour votre question: "Pourquoi est-il indéfini:", C'est parce que l'éditeur de liens n'est pas capable de trouver sa définition

Deuxième partie: "Si son rapport n’est pas défini", l’utilitaire nm lira l’ensemble du tableau des symboles de votre bibliothèque et l’imprimera. Donc, il suffit de le lire et de l’imprimer sans appliquer d’opérations dessus.

2
Fooo

Cela signifie que la bibliothèque fait référence à ce symbole (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage dans ce cas?) Mais qu’elle ne le définit pas; une partie du programme auquel vous le liez, ou une autre bibliothèque est supposée le faire. Si vous vouliez le définir dans votre bibliothèque, cela signifie que vous n'avez pas lié le fichier objet à la définition de ce symbole avec le reste du code de la bibliothèque.

0
Carl Norum