nm은 유닉스 및 유닉스 계열 시스템에서 제공되는 명령어 중 하나로, 오브젝트 파일(object file), 라이브러리 파일, 실행 파일 등에 포함된 심볼(symbol) 정보를 표시한다. 주로 개발·디버깅·링크 단계에서 사용되며, 심볼 테이블에 기록된 함수, 변수, 객체 등의 이름과 해당 심볼의 주소, 속성(예: 전역, 로컬, 외부 등)을 확인할 수 있다.
주요 기능
| 기능 | 설명 |
|---|---|
| 심볼 목록 출력 | 지정된 파일에 정의된 심볼들의 이름과 주소를 나열 |
| 심볼 속성 표시 | 심볼이 전역(global), 로컬(local), 약정(weak) 등 어떤 종류인지 표시 |
| 정렬 옵션 | 주소순, 이름순 등 다양한 정렬 기준 제공 |
| 필터링 옵션 | 특정 유형의 심볼만 표시하거나, 필요 없는 심볼은 제외 가능 |
일반적인 사용법
nm [옵션] 파일명...
예시:
nm a.out– 실행 파일a.out의 모든 심볼을 출력nm -g libmylib.a– 전역 심볼만 출력nm -C myprog.o– C++ 이름(매angled) 을 사람 읽기 쉬운 형태로 복원하여 출력 (-C는 demangle 옵션)
주요 옵션
| 옵션 | 의미 |
|---|---|
-a |
모든 심볼(숨겨진 심볼 포함) 출력 |
-g |
전역 심볼만 출력 |
-n 또는 --numeric-sort |
주소 순으로 정렬 |
-C |
C++ 심볼을 인간이 읽기 쉬운 형태로 변환 |
-s <섹션> |
특정 섹션(예: .text, .data)에 속한 심볼만 표시 |
-r |
역순으로 정렬 |
-p |
원본 순서대로 출력(정렬 안 함) |
-f <파일> |
파일 리스트를 지정한 파일에서 읽어들임 |
관련 도구와 차이점
objdump: 바이너리 전체를 디스어셈블하고 다양한 정보를 제공하지만,nm은 심볼 테이블에 초점을 맞춘다.readelf -s: ELF 포맷 전용으로 심볼 테이블을 표시한다.nm은 여러 포맷(ELF, COFF, Mach-O 등)을 지원한다.size: 섹션별 크기를 보여주며, 심볼 자체는 표시하지 않는다.
활용 사례
-
링크 오류 디버깅
정의되지 않은 심볼(undefined symbol)이 발생했을 때, 해당 심볼이 어느 오브젝트 파일에 정의되어 있는지 확인하기 위해nm을 사용한다. -
중복 정의 검증
동일한 전역 심볼이 여러 파일에 존재하는 경우,nm으로 각각의 파일을 조사해 중복 정의 여부를 판단한다. -
라이브러리 검사
정적 라이브러리(.a)나 동적 라이브러리(.so)에 포함된 공개 API 목록을 확인해 문서화하거나, 의존성 분석에 활용한다.
제한 사항
nm은 파일이 손상되었거나 지원되지 않는 포맷인 경우 정상적인 출력을 제공하지 않는다.- 옵션에 따라 출력 형식이 다르므로, 스크립트에서 파싱할 때는 일관된 옵션을 명시하는 것이 권장된다.
참고 문서
- GNU Binutils 매뉴얼:
nm명령어 설명 - 각 유닉스 배포판의
man nm페이지
위 내용은 공개된 매뉴얼과 문서에 근거한 객관적인 서술이며, 확인되지 않은 추측은 포함하지 않았다.