Оригинальный автор(ы) | Деннис Ритчи , Кен Томпсон ( AT&T Bell Laboratories ) |
---|---|
Разработчик(и) | Различные разработчики открытого и коммерческого ПО |
Первоначальный выпуск | 3 ноября 1971 г ( 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) |
Р | Глобальный символ «только для чтения» |
г | Локальный символ только для чтения |
Т | Глобальный текстовый символ |
т | Локальный текстовый символ |
У | Неопределенный символ |