2010-02-24 14 views
37

Wenn ich nm auf einem meiner Libs:nm: "U" Das Symbol ist nicht definiert

nm libmylib.so

ich eine Zeile wie diese

   U [email protected]@GLIBCXX_3.4 

ich den Mann überprüft Seite für nm und ich habe "U" Das Symbol ist nicht definiert. Was bedeutet ein undefiniertes Symbol wirklich?

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

+7

als beiseite, nm --demangle für c ziemlich nützlich ist ++ es die Symbole freundlicher macht –

Antwort

33

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 auch mit Ihrer Anwendung verknüpft werden 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, so dass Sie erwarten würden, dass es in Ihrer eigenen Bibliothek undefiniert ist. Es wird in Ihrer libc.so definiert, wo auch immer das ist, möglicherweise/usr/lib.

+0

Sieht aus wie ein Symbol von libstdC++, eigentlich, aber ja, würden Sie erwarten, dass für Sie zur Verfügung gestellt werden. – ephemient

+0

@ephemient: Woops, ich habe die XX am Ende verpasst :) Danke. – Troubadour

0

Bedeutet dies, 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?), Aber es nicht definiert; Irgendein Teil des Programms, mit dem Sie es verbinden, oder eine andere Bibliothek soll das tun. Wenn Sie es in Ihrer Bibliothek definieren wollten, bedeutet das, dass Sie die Objektdatei nicht mit der Definition dieses Symbols mit dem Rest des Bibliothekscodes verknüpft haben.

-1

Ich denke, es bedeutet genau das: undefined in diesem Objekt. Einige Symbole werden zur Laufzeit ausgewertet. Das ist wahrscheinlich einer von ihnen.

0

Entzifferung dies könnte wie folgt geschehen:

  U [email protected]@GLIBCXX_3.4 

Mittel:

U->>> in your library its undefined 

was nicht definiert ist?

 _ZNSs4_Rep20_S_empty_rep_storageE 

Wo ist es wahrscheinlich, es zu finden?

 GLIBCXX_3.4 
Verwandte Themen