운영체제의 기초 - 13. Program Linking and Executable File Generation
by jennysgapLinker 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
'BOX' 카테고리의 다른 글
운영체제의 기초 - 15. Segmentation and Paging 1 (0) | 2017.03.27 |
---|---|
운영체제의 기초 - 14. Dynamic Storage Allocation (0) | 2017.03.23 |
운영체제의 기초 - 12. Deadlock (0) | 2017.03.22 |
운영체제의 기초 - 11. Process Synchronization 2 (0) | 2017.03.22 |
운영체제의 기초 - 10. Process Synchronization 1 (0) | 2017.03.21 |
블로그의 정보
jennysgap
jennysgap