nm: "U" Символ не определен - PullRequest
       9

nm: "U" Символ не определен

47 голосов
/ 25 февраля 2010

Когда я нахожусь на одной из моих библиотек:

нм libmylib.so

Я получаю такую ​​строку

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

Я проверил справочную страницу для nm и получил "U". Символ не определен. Что на самом деле означает неопределенный символ?

Если оно действительно не определено, то почему nm сообщает об этом вообще?

Ответы [ 4 ]

43 голосов
/ 25 февраля 2010

Неопределенный символ - это символ, который библиотека использует, но не был определен ни в одном из объектных файлов, которые использовались при создании библиотеки.

Обычно символ определяется в другой библиотеке, которая также должна быть связана с вашим приложением. Кроме того, символ не определен, потому что вы забыли создать код, который определяет символ, или забыли включить объектный файл с этим символом в вашу библиотеку.

В вашем случае это выглядит как символ из библиотеки C вашей реализации, так что вы ожидаете, что он будет неопределенным в вашей собственной библиотеке. Он будет определен в вашем libc.so, где бы это ни было, возможно /usr/lib.

2 голосов
/ 13 февраля 2015

Расшифровка это может быть сделано так:

           U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

Средства:

    U->>> in your library its undefined

что не определено?

     _ZNSs4_Rep20_S_empty_rep_storageE

Где его можно найти?

      GLIBCXX_3.4

Теперь на ваш вопрос: «Почему он не определен?», Это потому, что компоновщик не может найти его определение

Вторая часть: «Если вообще неизвестно, зачем вообще сообщать об этом», утилита nm должна прочитать всю таблицу символов вашей библиотеки и распечатать ее. Таким образом, это просто чтение и печать без применения каких-либо операций над ним.

0 голосов
/ 25 февраля 2010

Я думаю, что это именно то, что: undefined в этом объекте. Некоторые символы оцениваются во время выполнения; это может быть один из них.

0 голосов
/ 25 февраля 2010

Это означает, что библиотека ссылается на этот символ (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage в данном случае?), Но не определяет его; какая-то часть программы, с которой вы ее связываете, или какая-то другая библиотека должна делать это. Если вы хотели определить его в своей библиотеке, это означает, что вы не связали объектный файл с определением этого символа с остальной частью кода библиотеки.

...