학습 주제
Relocatable Object file에 대한 ELF 형식에서 어떠한 내용들이 담겨있는지를 학습했다.
정리한 내용
7.4 Relocatable Object Files(재배치 가능 목적 파일)
전형적인 ELF relocatable object file을 보여주고 있다.
이 그림을 통해 Relocatable object file에 무엇이 있는지를 살펴보자.
1. ELF header
object file은 16-byte의 ELF header를 통해 시작하고 있다.
- 16-byte sequence가 담는 정보 : 현재 system의 word size와 byte-ordering(endian관련)에 대한 정보가 담겨 있다.
- 헤더의 나머지 부분 : linker가 이 object file을 parsing하고 해석하기 위한 정보가 담겨 있다.
- ELF header의 size
- Object file의 type(relocatable, executable, shared인지. 7.3에서 언급 되었었다).
- machine type(x86-64 등)
- Section header table의 file offset(현재 object file에서 Section header table의 위치가 어디인지)
- Section header table에서의 항목들의 개수와 size
2. Section header table
위의 여러 section들의 위치와 size 등이 담겨 있다. 각 section들을 위한 고정된 크기의 항목들이 담겨 있다.
3. Sections
- .text : compile된 machine code가 담겨 있다.
- .rodata : Read only data로, printf에 들어가는 문자열(””로 감싸어진 문자열) 또는 switch statment에서의 jump table등이 여기에 저장된다.
- .data : 초기화된 global 변수, 또는 초기화된 static C 변수가 저장된다.
- ※ 참고로 지역변수는 run-time에서만 스택에서 유지되고, .data 영역이나 .bss 영역 어느 곳에서도 저장하지는 않는다.
- .bss : 초기화 되지 않은 global & static C 변수가 저장된다. 이는 0으로 초기화 된 global & static C 변수도 포함한다.이렇게 함으로써 object file의 공간 효율도 좋게 하고, 초기화 된 것과 아닌 것들도 구분 가능해진다.⇒ 어차피 run-time 때에 이 변수들이 메모리에 할당되면서 0으로 초기화 될 것이기 때문이다.
- ⇒ https://kldp.org/node/122255 참고(data영역과 bss영역)
- 왜 object file에 초기화되지 않은 global 및 static 변수들은 저장하지 않는 것일까?
- 참고로 .bss section에는 어떠한 data도 없다고 한다. 이는 단지 자리리를 구분 및 표시하기 위한 것일 뿐이라고 한다.
- .symtab : 프로그램 내에서 정의되고 참조되는 함수와 전역변수의 정보에 대한 symbol table이 담겨 있다.단, comiler 안에 있는 symbol table과는 달리 .symtab 의 symbol table은 지역 변수는 저장하지 않는다.
- 그럼 compiler는 지역 변수를 symbol table에 저장한다는 것일까? compiler에 symbol table이 있나? ⇒ compiler는 token을 알아내기 위한 lexer(token 분석), 그리고 구분 분석기(parser)등을 통해 중간 언어(machine code)를 생성한다. 이 때, parser에 의해 scope를 알 수 있게 되고, 이 scope가 나올 때마다 해당 scope에서 선언된 변수 및 함수들을 symbol table에 저장하게 된다. 이렇게 모든 scope에 대한 symbol을 가지고 있게 되면서, 외부 scope에서 선언된 symbol에 대한 참조를 할 수 있게 되고, 또한 참조할 수 없는 곳에서 선언된 symbol을 참조하려 하면 오류를 낼 수 있게 되는 것이다.
- -g 옵션(디버깅 옵션)을 같이 주어 compile해야만 이 symbol table을 얻을 수 있다고 말하는 사람도 있는데, 모든 relocatable object file에는 .symtab section에 symbol table이 있다.
- .rel.text : **.text section에서 liker가 object file들을 다른 것과 결합할 때 변경이 되어야 하는 것들에 대한 location 리스트를 저장**하고 있다.하지만 local에 있는 function(같은 파일에 있는 함수)들을 호출하는 instruction은 변경될 필요가 없다. (TODO: 이것에 대한 이유로는 아마 PC relative 방법을 사용해서 그런것이 아닐까 싶다)
- ※ relocation 정보는 executable object file에서는 필요가 없다.(executable object file일 경우에는 이 .rel.text 가 없을 수도 있다는 뜻)
- 보통 다른 외부 함수나 외부 전역 변수를 사용하는 instruction의 경우 변경될 필요가 있다.
- .rel.data : 현재 object module에서 참조되고 정의되는 모든 global 변수들에 대한 relocation 정보를 저장한다.
- 만약, 이 global 변수의 초기값이 어느 global 변수의 주소를 담고 있거나(포인터), 외부 함수의 주소값이라면(함수 포인터), 이들은 이후에 변경되어 진다.
- .debug : debugging symbol table을 가지고 있다. 이 symbol table에선 지역 변수나 typedef들로 정의된 것들, 정의되거나 참조된 전역변수들, 그리고 원래의 C source file을 담고 있다.
- 이 section은 오로지 -g 옵션으로 컴파일 시 디버깅 옵션을 전달해야만 가능하다.
- .line : **.text 영역에 있는 machine code로 된 instruction과 C source 프로그램 안에서의 line number간의 mapping관계를 저장**하고 있다.
- 이것도 마찬가지로 -g 옵션에 의해서만 존재하게 된다.
- strtab : string으로 된 symbol table이다. 여기에 나오는 symbol들은 .symtab 과 .debug 에 나오는 symbol, 그리고 section header에 나오는 section 이름들이 들어간다.
- 이 string들은 전부 “null-terminated” string이다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 7.10 Dynamic Linking with Shared Libraries(공유 라이브러리 동적 링크) (0) | 2023.02.17 |
---|---|
[CSAPP] 7.5 Symbols and Symbol Tables(심볼과 심볼테이블) (0) | 2023.02.15 |
[CSAPP] 7.3 Object Files(목적 파일) (0) | 2023.02.15 |
[CSAPP] 7.2 Static Linking(정적연결) (0) | 2023.02.15 |
[CSAPP] 7.1 Compiler Drivers(컴파일러 드라이버) (0) | 2023.02.15 |