티스토리 뷰

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 swap
728x90
댓글