tgool
Tgool
tgool
전체 방문자
오늘
어제
  • 분류 전체보기
    • Data Science
      • AI
      • Data Mining
      • ML(Machine Learning)
    • Computer Science
      • 자료구조
      • 알고리즘
      • 시스템 프로그래밍
      • 운영체제
      • 컴퓨터 구조
      • 컴퓨터 네트워크
      • 데이터 베이스
      • 파이썬
      • 자바
      • 아두이노
    • Math
      • 통계학
      • 확률론
      • 선형대수학
      • 수리통계학
      • 회귀분석
    • TOFEL
    • Git
    • Plan
    • Book
    • Working out
      • 영양과 생활
      • 운동 정보
      • 운동 기록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
tgool

Tgool

[CSAPP] 7.4 Relocatable Object Files(재배치 가능 목적 파일)
Computer Science/컴퓨터 구조

[CSAPP] 7.4 Relocatable Object Files(재배치 가능 목적 파일)

2023. 2. 15. 10:33

학습 주제

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

  1. .text : compile된 machine code가 담겨 있다.
  2. .rodata : Read only data로, printf에 들어가는 문자열(””로 감싸어진 문자열) 또는 switch statment에서의 jump table등이 여기에 저장된다.
  3. .data : 초기화된 global 변수, 또는 초기화된 static C 변수가 저장된다.
  4. ※ 참고로 지역변수는 run-time에서만 스택에서 유지되고, .data 영역이나 .bss 영역 어느 곳에서도 저장하지는 않는다.
  5. .bss : 초기화 되지 않은 global & static C 변수가 저장된다. 이는 0으로 초기화 된 global & static C 변수도 포함한다.이렇게 함으로써 object file의 공간 효율도 좋게 하고, 초기화 된 것과 아닌 것들도 구분 가능해진다.⇒ 어차피 run-time 때에 이 변수들이 메모리에 할당되면서 0으로 초기화 될 것이기 때문이다.
  6. ⇒ https://kldp.org/node/122255 참고(data영역과 bss영역)
  7. 왜 object file에 초기화되지 않은 global 및 static 변수들은 저장하지 않는 것일까?
  8. 참고로 .bss section에는 어떠한 data도 없다고 한다. 이는 단지 자리리를 구분 및 표시하기 위한 것일 뿐이라고 한다.
  9. .symtab : 프로그램 내에서 정의되고 참조되는 함수와 전역변수의 정보에 대한 symbol table이 담겨 있다.단, comiler 안에 있는 symbol table과는 달리 .symtab 의 symbol table은 지역 변수는 저장하지 않는다.
  10. 그럼 compiler는 지역 변수를 symbol table에 저장한다는 것일까? compiler에 symbol table이 있나? ⇒ compiler는 token을 알아내기 위한 lexer(token 분석), 그리고 구분 분석기(parser)등을 통해 중간 언어(machine code)를 생성한다. 이 때, parser에 의해 scope를 알 수 있게 되고, 이 scope가 나올 때마다 해당 scope에서 선언된 변수 및 함수들을 symbol table에 저장하게 된다. 이렇게 모든 scope에 대한 symbol을 가지고 있게 되면서, 외부 scope에서 선언된 symbol에 대한 참조를 할 수 있게 되고, 또한 참조할 수 없는 곳에서 선언된 symbol을 참조하려 하면 오류를 낼 수 있게 되는 것이다.
  11. -g 옵션(디버깅 옵션)을 같이 주어 compile해야만 이 symbol table을 얻을 수 있다고 말하는 사람도 있는데, 모든 relocatable object file에는 .symtab section에 symbol table이 있다.
  12. .rel.text : **.text section에서 liker가 object file들을 다른 것과 결합할 때 변경이 되어야 하는 것들에 대한 location 리스트를 저장**하고 있다.하지만 local에 있는 function(같은 파일에 있는 함수)들을 호출하는 instruction은 변경될 필요가 없다. (TODO: 이것에 대한 이유로는 아마 PC relative 방법을 사용해서 그런것이 아닐까 싶다)
  13. ※ relocation 정보는 executable object file에서는 필요가 없다.(executable object file일 경우에는 이 .rel.text 가 없을 수도 있다는 뜻)
  14. 보통 다른 외부 함수나 외부 전역 변수를 사용하는 instruction의 경우 변경될 필요가 있다.
  15. .rel.data : 현재 object module에서 참조되고 정의되는 모든 global 변수들에 대한 relocation 정보를 저장한다.
  16. 만약, 이 global 변수의 초기값이 어느 global 변수의 주소를 담고 있거나(포인터), 외부 함수의 주소값이라면(함수 포인터), 이들은 이후에 변경되어 진다.
  17. .debug : debugging symbol table을 가지고 있다. 이 symbol table에선 지역 변수나 typedef들로 정의된 것들, 정의되거나 참조된 전역변수들, 그리고 원래의 C source file을 담고 있다.
  18. 이 section은 오로지 -g 옵션으로 컴파일 시 디버깅 옵션을 전달해야만 가능하다.
  19. .line : **.text 영역에 있는 machine code로 된 instruction과 C source 프로그램 안에서의 line number간의 mapping관계를 저장**하고 있다.
  20. 이것도 마찬가지로 -g 옵션에 의해서만 존재하게 된다.
  21. strtab : string으로 된 symbol table이다. 여기에 나오는 symbol들은 .symtab 과 .debug 에 나오는 symbol, 그리고 section header에 나오는 section 이름들이 들어간다.
  22. 이 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
    'Computer Science/컴퓨터 구조' 카테고리의 다른 글
    • [CSAPP] 7.10 Dynamic Linking with Shared Libraries(공유 라이브러리 동적 링크)
    • [CSAPP] 7.5 Symbols and Symbol Tables(심볼과 심볼테이블)
    • [CSAPP] 7.3 Object Files(목적 파일)
    • [CSAPP] 7.2 Static Linking(정적연결)
    tgool
    tgool

    티스토리툴바