기본사항

포큐아카데미 C언어

 

포큐아카데미 C언어

 

전처리기

입력값: 내가 작성한 소스코드

출력값: 트랜스레이션 유닛

설명: 전처리기는 주석을 제거하고,  include header 파일을 복붙한다.

예를들면 #include "adder.h" 라는 코드가 있으면 adder.h로 가서  int add(int a, intb);와 같은 선언을 복사 붙이기 해준다.  include <stdio.h> 하면 약 2천5백줄의 선언들을 복붙해줌.

 

 

 

컴파일러

입력값: 트랜스레이션 유닛

출력값: 어셈블리 코드

설명: 트랜스레이션 유닛 소스코드를 어셈블리어로 바꿔준다.(아직은 기계어가 아님) 여기서 핵심은 구멍이다. 똥구멍....

포큐아카데미 C언어

핵심은 일단 헤더(선언)만 보고 컴파일한다. 원형(내용)은 신경쓰지 않는다.

임의의 함수를 CALL하면(main에서 add 함수 호출) 링커가 그 구멍을 메워줄테니 일단은 컴파일하자!

 

 

어셈블러

입력값: 어셈블리 코드

출력값: 오브젝트 코드 : 기계어, 바이너리코드, 이진코드

설명: 어셈블러와 마찬가지로 구멍이 있음

 

포큐아카데미 C언어

 

 

링크

입력값: 모든 오브젝트 코드

출력값: 실행파일(.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

+ Recent posts