.o 파일 안에 뭐가 들어 있을까? Linux nm 명령어 초보자 친화적인 가이드
Source: Dev.to

nm 명령이란?
nm은 객체 파일이나 실행 파일의 심볼 테이블에 있는 심볼을 보여주는 Linux 명령입니다.
쉽게 말해, nm은 컴파일된 파일 안에 어떤 함수와 변수가 존재하는지 알려줍니다. 컴파일 후에 객체 파일 안에 무엇이 생성되었는지 확인할 때 흔히 사용합니다:
nm file.o
심볼이란?
심볼은 프로그램 안에서 어떤 것을 나타내는 이름에 불과합니다. C에서 심볼은 컴파일러가 컴파일된 파일 안에 기록하는 함수 이름이나 전역 변수 이름으로, 링커(및 시스템의 다른 부분)들이 서로 다른 코드 조각을 식별하고 연결할 수 있게 해줍니다.
일반적인 심볼은:
- 함수
- 전역 변수
심볼 테이블
| Symbol | 의미 | 간단한 설명 |
|---|---|---|
| T | 텍스트 (전역) | 전역 함수 |
| t | 텍스트 (지역) | 정적 함수 |
| D | 데이터 (전역) | 전역 초기화된 변수 |
| d | 데이터 (지역) | 정적 초기화된 변수 |
| B | BSS (전역) | 전역 초기화되지 않은 변수 |
| b | BSS (지역) | 정적 초기화되지 않은 변수 |
| U | 정의되지 않음 | 다른 곳에서 정의된 사용된 심볼 |
섹션 설명
- Text (
.text) – 함수(코드)를 저장 - Data (
.data) – 초기화된 변수를 저장 - BSS (
.bss) – 초기화되지 않은 변수를 저장 - Undefined (
U) – 심볼은 존재하지만 다른 곳에서 정의됨
메모리 레이아웃

예제
#include <stdio.h>
// Global variable
int global_var = 10;
// Static global variable
static int static_var = 20;
// Global function
void global_function() {
printf("Inside global function\n");
}
// Static function
static void static_function() {
printf("Inside static function\n");
}
int main() {
global_function();
static_function();
return 0;
}
컴파일 단계
Step 1 – 객체 파일로 컴파일
gcc -c file.c
이 명령은 file.o를 생성합니다.
Step 2 – 객체 파일에 nm 실행
nm file.o
전형적인 출력:
0000000000000000 T global_function
0000000000000000 T main
0000000000000000 t static_function
0000000000000000 D global_var
0000000000000000 d static_var
U printf
초보자를 위한 중요한 참고사항
- ✅ 전역 변수는 심볼이 됩니다.
- ✅ 함수는 심볼이 됩니다.
- ❌ 함수 내부의 로컬 변수는 일반적으로 심볼이 아닙니다.
void func() {
int x = 10; // 심볼이 아님 (지역)
}
x는 일시적인 변수이며 nm 출력에 나타나지 않습니다.
왜 로컬 변수는 나열되지 않을까?
로컬 변수는 링크에 필요하지 않기 때문에 생략됩니다. nm이 보여주는 심볼 테이블은 링커가 서로 다른 객체 파일을 연결하도록 돕기 위한 것이며, 로컬 변수는 함수 내부의 스택에만 존재하고 링크 과정에 전혀 관여하지 않기 때문입니다.