아스키로 이루어진 소스 파일은 기계어로 번역되어야 컴퓨터가 실행할 수 있다.
프로그램을 컴파일 했을 때 하나의 큰 파일로 만들게 되면 불편함이 있다.
프로그램의 일부만 바꿔도 모두 바꿔야 한다.
프로그램의 일부 기능만 재 사용하고 싶을때도 큰 파일을 다 가져와야 한다.
그래서 프로그램을 관련된 함수들만 따로 따로 파일을 만들고 프로그래머는 다른 파일에서 작업하게 한다.
즉, 프로그램을 파일 여러개로 조각 낸다.
이를 relocatable object files라고 한다.
다른 파일에 참조되거나 다른 파일을 참조할 수 있다.
object 파일들이 모두 연결되면 실행파일이다.
이때 연결하는 작업을 하는 애가 링커이다.
결국 실행파일은 object file의 모임이되는 것이다.
라이브러리에 있는 파일도 포함될 수 있다. 이것도 연결한다.
이렇게 하면 컴파일도 빠르고 재사용에도 좋다.
컴파일러가 컴파일한 이후 링커가 연결해줘야 실행할 수 있는 파일이다.
컴파일러 드라이버는 이런 과정을 묶어서 알아서 해주는 도구이다.
링킹은 컴파일 시간의 효율성 그리고 Modularity와 재사용성, 디스크 효율성을 증가시킨다.
object 파일들을 연결하는 과정을 말한다.
실행파일을 하나 만든다.
컴파일 타임에 링킹을 해주는 도구이다.
실행에 필요한 모든 것이 들어간다.
Symbol resolution - 외부에 정의된 함수나 변수들은 어느 파일에 선언된 것인지 정확히 알아야 한다. 이 작업을 의미한다.
relocation - 실행 파일이 메모리 상에서 실행될 때 주소를 올바르게 맞추는 작업. 이 과정은 주로 객체 파일(object file)이나 라이브러리 파일을 실행 파일로 결합하는 동안 발생하며, 메모리에서 각 코드와 데이터가 올바른 주소에 배치될 수 있도록 한다.
load 타임이나 run 타임에 링킹을 해주는 도구이다.
다른 Relocatable object 파일과 합쳐질 수 있는 파일
실행할 수 있는 형태로 Relocatable object file이 연결된 형태
dynamic 하게 메모리에 로드되거나 링크될 수 있는 Relocatable object file
object file들을 병합한다.
여기서 병합이란 Relocatable Object file들의 데이터와 코드들을 Executable Object File에 적재하는 것이다.
External Reference란 다른 object file에 있는 symbol들을 의미한다.
symbols들을 virtual address들로 다 대체한다.
symbol이란 외부에 있는 함수나 변수들을 말한다.
작은 조각으로 만들어서 동시 작업을 가능하게 하고 재사용이 쉽게 만든다.
프로그램을 작은 소스파일들의 집합으로 만든다.
라이브러리로 제공하기 쉬워진다.
컴파일 할 때 바뀐 부분만 컴파일 해주면 되기 때문에 시간적으로 이득이 된다.
컴파일할 때 사용하는 것들만 가져오기 때문에 불필요한 것들을 포함하지 않게 된다. 공간적으로 이득이다.
Object 파일은 시스템에 따라 포맷이 다르다.
Object file의 정규적인 이진 포맷이다.
V Unix의 AT&T 시스템에서 유래했다.
Relocatble object files와 Executable object files와 shared object files에 다 적용된다.
일반적인 이름은 ELF Binary라고 부른다.
기존보다 공유되는 라이브러리가 더 좋다.
정의되어 있는 것들
1. 워드 사이즈
2. byte ordering(리틀 엔디안, 빅 엔디안)
3. machine type
4. ELF Header 크기
5. object file 타입
6. 세션 파일 위치
Executable Obejct file에만 필요하다.
페이지의 크기가 얼마인지 메모리 맵에서 각 세그먼트 시작 위치가 어디인지 저장되어 있다.
접근 권한도 저장되어 있다.
섹션의 크기와 위치를 가진다.
각 세션에 대해 고정된 사이즈이다.
글로벌 변수는 함수 밖에서 선언된 변수이다. 어디서든 접근 가능한 변수이기도 하다.
글로벌 변수는 static인데 항상 주소를 가진다. 근데 초기화되지 않은 것들은 정보를 가질 필요가 없어 여기에 저장한다.
문제가 생길까봐 0으로 초기화 한다. 근데 다 0으로 초기화할 건데 공간 낭비 안하고 그냥 여기 넣어두면 된다.
참고 원래 코딩할때 변수들은 다 초기화하고 사용해야 한다. 초기화안하면 다른 곳을 가르키게 되는데 이 구간이 악성코드라면.... 그래서 초기화 한다.
다른 파일에서 참조할 수 있는 함수나 글로벌 변수가 있을 수 있다. 이에 대한 정보가 여기에 있다.
외부 변수의 경우 ?로 저장되어 있는데 이와 같은 재배치 정보는 주로 외부 변수나 함수처럼 실행 시점에 주소를 확정해야 하는 항목에 대한 데이터를 포함해야 한다.
코드(텍스트 섹션, 즉 .text)에 대한 재배치 정보를 저장
데이터 섹션(예: .data 또는 .bss)에 대한 재배치 정보를 저장
symbolic debugging에 대한 정보
소스 코드의 라인 번호(line number)와 실행 가능한 기계 코드(바이너리 코드) 간의 매핑 정보를 포함
ELF 파일의 심볼 이름, 섹션 이름, 또는 기타 텍스트 데이터를 저장하는 테이블
life는 렘과 메모리에 존재하면 살아있다고 한다.
scope 해당 객체가 어떤 영역에서 접근될 수 있는지를 말한다.
함수밖에서 선언된 변수는 글로벌 변수가 된다.
함수내에서 선언된 변수는 로컬 변수가 된다.
로컬 변수란 함수 안에 정의된 변수이다.
로컬 변수는 함수 내에서만 접근 가능하다.
스태틱 로컬 변수 - 사용 범위는 로컬인데 스태틱처럼 계속 존재한다.
링커 입장에서 ?들을 relocation해야 한다. ?는 변수일 수도 있지만 함수 일 수도 있다.
?를 symbol들이라고 한다.
어떤 모듈에서 정의되어 있고 다른 모듈에서 참조될 수 있는 글로벌 symbol
다른 모듈에서 정의되었고 어떤 모듈에서 정의된 글로벌 Symbol
external 심볼이라 불린다.
어떤 모듈내에서 정의되고 참조되는 Local Symbol