нм (Unix)

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

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

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

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

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

/* * Имя файла: test.c * Для кода C компилируйте с помощью: * gcc -c test.c * * Для кода C++ компилируйте с помощью: * g++ -c test.cpp */интервал global_var ; int global_var_init = 26 ;    статическое целое static_var ; статическое целое static_var_init = 25 ;      статическая целая статическая_функция () { return 0 ; }   int global_function ( int p ) { static int local_static_var ; static int local_static_var_init = 5 ;      local_static_var = p ;  вернуть 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 () { // Я ничего не делаю }  int main ( void ) { global_var = 1 ; static_var = 2 ;     вернуть 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++ вывод отличается:

# нм  тест.о 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)
РГлобальный символ «только для чтения»
гЛокальный символ только для чтения
ТГлобальный текстовый символ
тЛокальный текстовый символ
УНеопределенный символ

Смотрите также

Взято с "https://en.wikipedia.org/w/index.php?title=Nm_(Unix)&oldid=1255169115"