본문 바로가기
리눅스

nm (Unix)

by 다움위키 2023. 12. 22.

nm 명령은 Plan 9를 포함한 유닉스유닉스-계열 운영 시스템의 여러 이후 버전과 함께 제공됩니다. nm은 바이너리 파일 (라이브러리, 컴파일된 객체 모듈, 공유된-객체 파일, 및 독립-실행형 실행 파일 포함)을 검사하고 그들 파일의 내용, 또는 그 파일에 저장된 메타 정보, 특히 기호 테이블을 표시하기 위해 사용됩니다. nm으로부터 출력은 다양한 기호 유형을 구별합니다. 예를 들어, 그것은 객체 모듈에 의해 제공된 함수와 그것에 의해 요구된 함수를 구분합니다. nm은 디버깅을 지원하고, 이름 충돌과 C++ 이름 맹글링으로 인해 발생하는 문제를 해결하고, 도구-체인의 다른 부분을 검증하기 위해 사용됩니다.

GNU ProjectGNU Binutils 패키지의 일부로 nm의 구현을 제공합니다.

nm output sample

/*
 * 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

출력 사이의 차이점은 C++ 코드에서 extern "C"를 사용함으로써 이름 맹글링 문제를 해결하는 예제도 보여줍니다.

See also

External links