7.4-Relocatable_Object_Files

PARA/Project/CS_APP_organize/chapter7/imgs/ELF_relocatble_obj.png
ELF Header는
16바이트 배열로 word 사이즈와 이 파일을 생성한 시스템의 바이트 순서가 저장되어있다.
header 의 나머지 부분은 linker 가 목적파일을 파싱하고 해석하는데 필요한 정보가 담겨있다.
이것은 ELF Header 의 사이즈, Obj 파일의 형식(relocatable, executable, shared),
machine-type(x86-64...), section header table에 대한 file offset(base 주소로부터의 거리),
section header table 로 향하는 entries 의 개수와 사이즈 가 있다.

section header table에는
다양한 section에 대한 위치와 사리즈가 저장되어 있다.
또한, 각 section 에 대한 고정된 크기의 entry 도 존재한다.

ELF Header 와 Section header Table 사이에는 실제 section 이 존재한다.
보통은 아래와 같은 section 을 갖는다.


  • 컴파일된 프로그램이 machine code 형태로 저장되어있다.

  • Read-Only 데이터, Printf의 형식지정자, switch 문의 jump tables 등이 존재한다.

  • 된 전역, static 변수가 저장되어있다.
    지역변수는 stack 에 run-time 시에 존재하므로, data 나 아래의 bss에 존재하지 않는다.

  • 된 전역, static 변수, 0으로 초기화된 전역 static 변수가 저장되어있다.
    이 구역은 실제로는 공간을 차지하지 않는다.
    단순한 임시공간(PlaceHolder) 로 Obj 파일 형식은 공간효율을 위해 초기화, 비초기화 변수들을 구분한다.(초기화되지 않은 변수는 공간을 차지할 필요가 없다.)
    run-time 시에 이 변수들은 메모리에 0으로 초기화되면서 할당된다.

  • 이 저장되어있다.
    해당 테이블에는 프로그램에서 정의되고 사용되는(참조되는) 함수와 전역변수에 대한 정보가 담겨있다.
    모든 relocatable 목적파일은 symbol table 이 .symtab 에 존재한다.
    하지만, 컴파일러에 있는 symbol table 과 달리, 지역변수에 대한 접근은 존재하지 않는다.

  • .text 영역 중 linker 가 다른 목적파일과 연결할 때, 변경되어야하는 위치들의 모음이다.
    보통 전역변수나 외부 함수에 대한 call 을 나타내는 명령어가 해당된다.
    이 정보는 실제 실행목적파일에 필요하지 않기 때문에, 따로 linker에 포함해달라는 요청이 있지 않는 한, 제거된다.

  • 전역변수에 대한 재할당 정보, 그중에서 모듈에 의해 참조되거나 정의된 정보에 해당한다.
    보통 전역변수나 외부 함수에 대한 주소를 초기값으로 갖는 초기화된 전역변수에 해당한다.

  • 컴파일러에 -g 옵션(debugging information 생성 요청) 이 있을 경우, 만들어진다.
    지역변수, 프로그램 내 타입 정의, 프로그램 내에 정의되고 참조된 전역변수, C언어 소스코드 에 대한 entries 가 저장된 debugging symbol table 이 존재한다.

  • 컴파일러에 -g 옵션(debugging information 생성 요청) 이 있을 경우, 만들어진다.
    line number 와 C언어 소스코드 간의 맵핑을 저장한다.

  • string table로, .symtab, .debug 영역의 symbol table, section header 에 존재하는 section 이름을 위해 존재한다.
    이 테이블은 null-terminated 문자열의 배열이다.