딩굴댕굴

운영체제의 기초 - 13. Program Linking and Executable File Generation

by jennysgap

BOX

Linker and Loader

메모리 관리자~













Symbol Table: 프로그램에서 사용하는 Symbol들에 대한 정보를 저장하는 자료구조





Compiler: individual source file을 object file로 변환시키는 역할

Linker: 여러개의 object file을 묶어서 하나의 executable file로 만들어주는 역할

Loader: 이것은 OS의 한 툴임. fork()와 exec()

  - main memory에 object file의 내용을 다 layout하고 context를 build하고 수행시킬 수 있도록 하는 역할






object file 안에는 여러개의 section unit 들이 존재

section: data를 묶어둔 단위, object file을 구성하는 단위

 - type과 속성이 다 다를 수 있다

 - instruction들은 다 모여서 하나의 section을 구성하고

 - data들도 별도로 section을 구성함

 - 나중에 메모리에 저장이 될 때 독자적인 영역을 갖음 그것을 segment라고 함




object file들을 구성하는 section들을 알아 보겠음

Text section: (=code section), instruction들이 들어 있음

Data section: 초기화된 전역 변수들이 저장되어 있음

BSS section: 초기화 되지 않은 전역 변수들이 저장되어 있음




전역 변수: x, y, z, m

code로는 func, main 이 존재









Linker script에 따라 Linker가 어떤 형태로 Layout을 만들지 설정할 수 있음

- Linker script를 이용해서 text section은 몇 번지에서 저장을 해야 하고 

   data section은 몇 번지에 저장해야 한다 뭐 이런 정보가 있는 거죠


Layout이 끝난다고 하는 것은 executable file이 만들어 졌다는 말

executable file을 OS load가 읽어서 깔아 주면 됨

어떻게 깔아줄까?





이미 executable file에는 Data section은 몇번지에 저장하고 code section은 몇번지에 저장해야 한다는 정보들이 다 있음

그대로 다 읽어주면 됨

맨마지막에 Program Counter (PC)를 executable file entry point로 셋팅하면 로딩이 끝나고 수행하게 됨



Linking Process

Linker의 Linking 과정을 들여다 보면 몇 가지 문제점들을 찾아 볼 수 있음

1. Compiler가 주는 문제





source 코드로 코딩을 할 때는 프로그램의 entity들을 symbolic한 이름으로 줌 (함수, 변수 이름)

symbol이 주소로 변환이 되어야 함

- symbol이 주소로 변환되려면 symbol이 어느 위치에 저장되었는지 알아야 함

- 쉽게 알 수 있을까? Nope

- C는 소스파일이 여러개로 쪼개져 있고 object 파일도 쪼개져 있기 때문에 

- 컴파일러가 한 object 파일을 만지고 있을 동안 다른 object 파일에서 정의된 symbol의 주소를 알 길이 없음

- 이것을 Cross-Reference라고 함

- 컴파일러와 링커의 문제임


Cross-Reference: 내가 여기서 사용하고 있지만 다른 파일에서 주소의 위치가 정해진 symbol들

적어도 Two path Operation을 해야 linking을 할 수 있음






Symbol Table과 Relocation Table이 중요한 역할을 함

Symbol Table: 심볼이 나오면 주소와 기타 정보들을 한 곳에 모아둠




Symbol table을 검색할 때는 symbol의 이름으로 검색한다. 그리고 symbol의 주소가 적혀있어야 함

기록할 때는 Section의 이름과 Section의 offset을 적음





알 수 있는 주소가 적혀있으면 자기랑 같은 object file에 있는 것

- 주소를 생성할 때 section 시작주소 + section offset이라고 했는데 

- 이것을 PC relative(상대적인) 주소로 바꾼다.

- 즉, Relocation address 로 바꿈


Internal Symbol들에 대해 PC Relative Addressing을 하는 이유

전체 Section의 위치에 관계없이 PC로부터의 상대적인 주소는 바뀌지 않기 때문




다른 section에 있는 symbol을 Cross reference 라고 한다

Cross reference: 전역변수인데 내가 호출하거나 접근하지만 걔가 정의된 것은 다른 파일에 있는 것


Relocation Table: 

- Cross reference가 나타난 위치를 기제

- 다음 사이클에 이를 해결함





Linker가 각 object file들을 하나하나하나 처리하게 되면 linker script에 따라서 각 section들의 위치를 부여할 수 있음

각 section들의 위치가 부여가 되면

그 section 안에서 정의된 symbol들의 실제 주소를 얻어낼 수 있음


C 언어의 extern 키워드

해당 변수가 외부의 다른 파일에서 정의되었다는 것을 알려주는 키워드






























Static Storage Allocation

- Code Segment

- Data Segment


Dynamic Storage Allocation

- stack Segment

- Heap Segment










출처 - http://snui.snu.ac.kr/ocw/index.php?mode=view&id=663

출처 - http://snui.snu.ac.kr/ocw/index.php?mode=view&id=664

반응형

블로그의 정보

jennysgap

jennysgap

활동하기