wake-up-neo.com

nm: "U" Das Symbol ist undefiniert

Wenn ich mich auf einer meiner Libs befinde:

nm libmylib.so 

Ich bekomme so eine Zeile

             U [email protected]@GLIBCXX_3.4

Ich habe in der Manpage nach nm gesucht und "U" erhalten. Das Symbol ist undefiniert. Was bedeutet ein undefiniertes Symbol?

Wenn es wirklich undefiniert ist, warum meldet es dann überhaupt?

46
bbazso

Ein undefiniertes Symbol ist ein Symbol, das von der Bibliothek verwendet wird, aber in keiner der Objektdateien definiert wurde, die zum Erstellen der Bibliothek verwendet wurden.

Normalerweise ist das Symbol in einer anderen Bibliothek definiert, die ebenfalls mit Ihrer Anwendung verknüpft sein muss. Alternativ ist das Symbol nicht definiert, weil Sie vergessen haben, den Code zu erstellen, der das Symbol definiert, oder Sie haben vergessen, die Objektdatei mit diesem Symbol in Ihre Bibliothek aufzunehmen.

In Ihrem Fall sieht es aus wie ein Symbol aus der C-Bibliothek Ihrer Implementierung. Sie würden also erwarten, dass es in Ihrer eigenen Bibliothek undefiniert ist. Es wird in Ihrer libc.so definiert, wo immer dies möglich ist, möglicherweise in/usr/lib.

42
Troubadour

Das zu entschlüsseln könnte folgendermaßen aussehen: 

           U [email protected]@GLIBCXX_3.4

Meint:

    U->>> in your library its undefined

was ist undefiniert?

     _ZNSs4_Rep20_S_empty_rep_storageE

Wo ist es wahrscheinlich zu finden?

      GLIBCXX_3.4

Nun zu Ihrer Frage: "Warum ist undefiniert:", Es ist, weil der Linker seine Definition nicht finden kann

Zweiter Teil: "Wenn es undefiniert ist, warum überhaupt ein Bericht erstellt wird", wird das nm-Dienstprogramm die gesamte Symboltabelle Ihrer Bibliothek lesen und diese drucken. Also, es ist nur lesen und drucken, ohne irgendwelche Operationen darauf anzuwenden.

2
Fooo

Dies bedeutet, dass die Bibliothek dieses Symbol referenziert (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage in diesem Fall?), Es aber nicht definiert wird. ein Teil des Programms, mit dem Sie es verknüpfen, oder eine andere Bibliothek soll das tun. Wenn Sie es in Ihrer Bibliothek definieren wollten, bedeutet dies, dass Sie die Objektdatei nicht mit der Definition dieses Symbols mit dem restlichen Bibliothekscode verknüpft haben.

0
Carl Norum