Linking is performed automatically by programs called linker
의미를 완전히 구분 짓기도 하지만, 거의 같은 의미긴 하다.
큰 의미의 컴파일 과정으로 싹다, "Compiliing + Linking" 이 전 구간을 말하기도 한다.
1) 컴파일러는 Highl level 언어로 작성한 소스 파일을
컴퓨터가 이해할 수 있는 Low level언어, 이진수 파일로 변환해준다.
이 파일이 바로 object file이다!!
2) 이 object file은 기계어로 작성된 로직과 실행하는데 필요한 정보들(디버깅 or Symbol정보) 들로 이루어짐.
3) 그 다음이, 링킹(linking)이다. 여러개의 재배치 가능한 object file들을 모아서 하나의 실행가능한 파일로 만들어지는 과정이다.
4) 이 object file들은 자신만의 code섹션과 data 섹션을 가진다
간단하게
1) object file을 하나로 합치기
2) 여기에 Library까지 합쳐서
-> 하나의 실행파일 만들기
좀 더 깊게
: object 파일에 있는 각각의 Symbol Reference를 정확히 하나의 Symbol Definition에 연결하는 작업. 여기서 Symbol은 함수, 전역변수, static 변수 등을 의미한다.
컴파일러와 어셈블러는 기본적으로 0번지에서 시작하는 코드 섹션과 데이터 섹션을 만들어 낸다. 링커는 이러한 섹션들을 적절한 가상 주소로 재배치하고, 이에 따라 각 심볼 정의에도 알맞은 가상 주소를 부여한다.
1) Relocatable object file
: 컴파일의 output
2) Execuatable object file
: 링커의 output
(즉, 실행파일이라 부름, 코드와 데이터가 메모리에 로드되어 실행될 수 있음)
3) Shared object file
: road time이나 run time에 동적으로 메모리에 로드되어 링킹 됨.
(Dynamic Linker Libraries(DLL)이 대표적)
각 오브젝트 파일은 특정 오브젝트 파일 포맷을 가진다.
오브젝트 파일 포맷은 컴파일러와 어세블러가 만들어내는 정보를 relocatable object file 안에 어떤 구조로 담을지 결정한다(시스템ㅁ다 각기 다름)
-> 내가 배우고 있는건! ELF라는 오프젝트 파일 포맷 기준으로 설명!(아래 그림)
data section : Initialized global variables
bss section : Unitialized global variables
bss는 오브젝트 파일에서 전혀 공간을 차지하지 않고, 실행파일에서도 이곳에 저장될 데이터의 총 사이즈 "정보"를 저장할 만큼의 공간만 차지한다.
즉, 프로그램이 실행될때 이 정보를 바탕으로 bss 섹션을 메모리에 할당하는 것!!
결국엔, "Better Save Space"를 위해서다.
아 그리고, 이건 그냥 내가 정리
- 초기화된 전역변수, static 변수는 data 섹션에 저장됨.
- non-static local 변수는 스택 영역에서 저장 관리..
- static local 변수는 스택을 통해서 제공되는게 아니라, data 섹션에 들어감. 프로그램 끝날때까지 메모리에 상주할 수 있음.
symbol : reference to a variable or to a function
Linker symbol은 program 변수랑은 다른 개념임!
1) global symbols
: non-static 함수 또는 전역변수 등
2) external symbols
3) local symbols
: static 함수 또는 전역/지역 변수
여기까지 달려온 이유는!!!! 결국 주어진 코드 보고 각 symbol의 symbol entry 존재 여부, symbol type, section등을 구분 지을 수 있느냐이다..(symbol table)
심볼 종류.. 설명 자세히
일단, 여기까지 추가로 더 배우는 개념은 나중에.. ㅎ