Jump to content

нм (Unix)

нм
Оригинальный автор(ы) Деннис Ричи ,
Кен Томпсон
( AT&T Bell Laboratories )
Разработчик(и) Различные с открытым исходным кодом и коммерческие разработчики разработчики
Первоначальный выпуск 3 ноября 1971 г .; 52 года назад ( 1971-11-03 )
Написано в С
Операционная система Unix , Unix-подобные , Plan 9
Платформа Кросс-платформенный
Тип Команда
Лицензия План 9: МОЯ лицензия

nm ( искажение имени ) — это команда Unix, используемая для выгрузки таблицы символов и их атрибутов из двоичного исполняемого файла (включая библиотеки , скомпилированные объектные модули , файлы общих объектов и автономные исполняемые файлы ).

Выход из nm различает различные типы символов. Например, он различает функцию , предоставляемую объектным модулем, и функцию, которая ему требуется. nm используется в качестве вспомогательного средства при отладке , для решения проблем, возникающих из-за конфликтов имен и искажения имен C++ , а также для проверки других частей цепочки инструментов .

Эта команда поставляется с рядом более поздних версий Unix и аналогичных операционных систем, включая Plan 9 . Проект GNU реализует реализацию nm как часть пакета GNU Binutils .

выходной образец нм

[ редактировать ]
/*
 * File name: test.c
 * For C code compile with: 
 * gcc -c test.c
 *
 * For C++ code compile with:
 * g++ -c test.cpp
 */

int global_var;
int global_var_init = 26;

static int static_var;
static int static_var_init = 25;

static int static_function()
{
	return 0;
}

int global_function(int p)
{
	static int local_static_var;
	static int local_static_var_init=5;

	local_static_var = p;

	return local_static_var_init + local_static_var;
}

int global_function2()
{
	int x;
	int y;
	return x+y;
}

#ifdef __cplusplus
extern "C"
#endif
void non_mangled_function()
{
	// I do nothing
}

int main(void)
{
	global_var = 1;
	static_var = 2;

	return 0;
}

Если предыдущий код скомпилирован с помощью компилятора gcc C, выходные данные nm команда следующая:

# nm test.o
0000000a T global_function
00000025 T global_function2
00000004 C global_var
00000000 D global_var_init
00000004 b local_static_var.1255
00000008 d local_static_var_init.1256
0000003b T main
00000036 T non_mangled_function
00000000 t static_function
00000000 b static_var
00000004 d static_var_init

При использовании компилятора C++ выходные данные отличаются:

# nm test.o
0000000a T _Z15global_functioni
00000025 T _Z16global_function2v
00000004 b _ZL10static_var
00000000 t _ZL15static_functionv
00000004 d _ZL15static_var_init
00000008 b _ZZ15global_functioniE16local_static_var
00000008 d _ZZ15global_functioniE21local_static_var_init
         U __gxx_personality_v0
00000000 B global_var
00000000 D global_var_init
0000003b T main
00000036 T non_mangled_function

Различия между выходными данными также показывают пример решения проблемы искажения имен с помощью использования extern «C» в коде C++.


Типы символов
Тип символа Описание
А Глобальный абсолютный символ.
а Локальный абсолютный символ.
Б Глобальный символ BSS.
б Местный символ BSS.
Д Символ глобальных данных.
д Символ локальных данных.
ж Символ имени исходного файла.
л Глобальный локальный символ потока (TLS).
л Статический локальный символ потока (TLS).
Р Глобальный символ только для чтения.
р Локальный символ только для чтения.
Т Глобальный текстовый символ.
т Локальный текстовый символ.
В Неопределенный символ.

См. также

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 9d128cb9697c3fa195cd246e1972194c__1688740920
URL1:https://arc.ask3.ru/arc/aa/9d/4c/9d128cb9697c3fa195cd246e1972194c.html
Заголовок, (Title) документа по адресу, URL1:
nm (Unix) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)