нм (Unix)
Оригинальный автор(ы) | Деннис Ричи , Кен Томпсон ( AT&T Bell Laboratories ) |
---|---|
Разработчик(и) | Различные с открытым исходным кодом и коммерческие разработчики разработчики |
Первоначальный выпуск | 3 ноября 1971 г |
Написано в | С |
Операционная система | 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). |
Р | Глобальный символ только для чтения. |
р | Локальный символ только для чтения. |
Т | Глобальный текстовый символ. |
т | Локальный текстовый символ. |
В | Неопределенный символ. |
См. также
[ редактировать ]Внешние ссылки
[ редактировать ]
- Единая спецификация UNIX , версия 4 от The Open Group : запись списка имен объектного файла – Справочник по оболочке и утилитам,
- Plan 9 , том 1 Руководство программиста –