기본사항
전처리기
입력값: 내가 작성한 소스코드
출력값: 트랜스레이션 유닛
설명: 전처리기는 주석을 제거하고, include header 파일을 복붙한다.
예를들면 #include "adder.h" 라는 코드가 있으면 adder.h로 가서 int add(int a, intb);와 같은 선언을 복사 붙이기 해준다. include <stdio.h> 하면 약 2천5백줄의 선언들을 복붙해줌.
컴파일러
입력값: 트랜스레이션 유닛
출력값: 어셈블리 코드
설명: 트랜스레이션 유닛 소스코드를 어셈블리어로 바꿔준다.(아직은 기계어가 아님) 여기서 핵심은 구멍이다. 똥구멍....
핵심은 일단 헤더(선언)만 보고 컴파일한다. 원형(내용)은 신경쓰지 않는다.
임의의 함수를 CALL하면(main에서 add 함수 호출) 링커가 그 구멍을 메워줄테니 일단은 컴파일하자!
어셈블러
입력값: 어셈블리 코드
출력값: 오브젝트 코드 : 기계어, 바이너리코드, 이진코드
설명: 어셈블러와 마찬가지로 구멍이 있음
링크
입력값: 모든 오브젝트 코드
출력값: 실행파일(.exe 파일)
설명: 모든 오브젝트 코드를 모아다 구멍을 메꾼 뒤 실행파일로 저장
좀 더 자세히(서술): 링커가 오브젝트 파일을 다 모아서 하나의 이진(binary)파일로 만들고 있었다. 그러다가 main 함수에서 add를 호출하는 것을 보았다. 현재 main함수에 add call은 선언만 있지 정의(내용)은 없다 즉 구멍이 뚫려있다. 이것을 본 링커는 똥구멍을 긁으며 "내가 오브젝트 파일을 다 검토하고 있는데 add 함수의 정의(내용)는 XX주소에 있는걸 확인했어 그러니 그 구멍에 XX주소로 점프하는 코드를 넣어줄게!
왜 링킹하냐?
'C' 카테고리의 다른 글
해쉬테이블 기초(간단) (0) | 2020.02.28 |
---|---|
C언어 스택, 큐 자료구조 소스 코드 (0) | 2020.02.26 |
C언어 배열 삽입, 삭제 (2) | 2020.01.03 |
C언어 void* (0) | 2019.12.20 |
C 언어 변수에 함수 할당 (0) | 2019.12.20 |