WIPIVERSE

nm (유닉스)

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: 섹션별 크기를 보여주며, 심볼 자체는 표시하지 않는다.

활용 사례

  1. 링크 오류 디버깅
    정의되지 않은 심볼(undefined symbol)이 발생했을 때, 해당 심볼이 어느 오브젝트 파일에 정의되어 있는지 확인하기 위해 nm을 사용한다.

  2. 중복 정의 검증
    동일한 전역 심볼이 여러 파일에 존재하는 경우, nm으로 각각의 파일을 조사해 중복 정의 여부를 판단한다.

  3. 라이브러리 검사
    정적 라이브러리(.a)나 동적 라이브러리(.so)에 포함된 공개 API 목록을 확인해 문서화하거나, 의존성 분석에 활용한다.

제한 사항

  • nm은 파일이 손상되었거나 지원되지 않는 포맷인 경우 정상적인 출력을 제공하지 않는다.
  • 옵션에 따라 출력 형식이 다르므로, 스크립트에서 파싱할 때는 일관된 옵션을 명시하는 것이 권장된다.

참고 문서

  • GNU Binutils 매뉴얼: nm 명령어 설명
  • 각 유닉스 배포판의 man nm 페이지

위 내용은 공개된 매뉴얼과 문서에 근거한 객관적인 서술이며, 확인되지 않은 추측은 포함하지 않았다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기