IT 관련 유용한 것들
Relocatable File의 Symbol Table 조회하는 3가지 키워드
Korean Eagle
2024. 11. 23. 13:00
728x90
윈도우에 실행 파일이 PE 포멧이듯, 리눅스에는 ELF 포멧이 기본이다. 아래는 relocatable 파일(쉽게 말하면 오브젝트 파일)의 심볼테이블 (변수나 함수)를 링커에서 사용하는데 아래의 명령어들로 화면에 출력해 볼 수 있다.
1. readelf -s main.o
리눅스에서는 대부분 오브젝트 파일을 elf 포멧으로 생성하므로 아래의 readelf를 사용할 수 있다.
- 아래를 보면 section에 대한 정보가 나오지만 어떤 심볼이 어떤 섹센에 포함된지 이해하기 힘들다.
- buf, main이 global symbol 이다.
- swap, printf가 external 이다. global + UND 정의되지 않는 심볼
Symbol table '.symtab' contains 8 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text
3: 0000000000000000 0 SECTION LOCAL DEFAULT 5 .rodata
4: 0000000000000000 8 OBJECT GLOBAL DEFAULT 3 buf
5: 0000000000000000 59 FUNC GLOBAL DEFAULT 1 main
6: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND swap
7: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND printf
2. objdump -t main.o
디어셈블을 위한 -d 옵션 이외에도 symbok table을 조회하는 기능을 제공한다.
- 좀 더 이해하기 쉽게 표현되어 있다. assembly 코드와 거의 유사하기 때문이다.
- buf는 .data에 속한 초기화된 global symbol이다. main은 F(함수)로 .text 섹션에 포함된 실행 코드이다.
- swap, printf는 정의되지 않았으므로 external 심볼이다.
main.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 main.c
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 g O .data 0000000000000008 buf
0000000000000000 g F .text 000000000000003b main
0000000000000000 *UND* 0000000000000000 swap
0000000000000000 *UND* 0000000000000000 printf
3. nm main.o
일반적으로 가장 많이 사용하는 nm 명령어는 elf 포멧 섹션까지 분석해 주진 않는다.
- 아주 간단하게만 나와 있다. buf는 정의된 심볼, T는 text section에 속한다. printf, swap은 외부 심볼(미정의)
0000000000000000 D buf
0000000000000000 T main
U printf
U swap728x90