[build] C의 빌드 과정_2

·2022년 6월 8일

C-Study

목록 보기
16/21

#20220608
66-72

#66
#include <> vs#include ""
<> : c에서 자체 제공하는 라이브러리의 헤더파일 인클루드 할 때
"" : 우리가 직접 만든 헤더파일 인클루드 할 때

  • 이 둘의 차이는 디스크상의 어디에서 헤더를 찾느냐의 차이
  • <>는 시스템 경로에서만 헤더파일 검색
    • #include <stdio.h>
  • ""는 현재 작업중인 디렉터리에서 헤더파일을 검색한 후 없으면 시스템 경로를 검색
    • 개발자가 구현한 헤더파일을 인클루드할때 사용
      #include "adder.h"

#67
😎 전처리 단계/ 전처리기 (preprocessor) 별도 프로그램

1). 주석 제거
2). 매크로를 복붙 확장함 (#으로 시작하는 것)
3). include파일들 복붙 확장함
#include "adder.h" (헤더파일)을 지우고 그자리에 헤더 파일 속에 있는 내용들을 복사해다가 가져다 붙임

★ 시스템 헤더파일인 #include <stdio.h>
역시 파일 속에 있는 내용을 복사해다 가져다 붙인 것

#68
트랜슬레이션 유닛

#69
[빌드과정:컴파일단계]
✓ 'compiler' 라는 프로그램이 담당

  • 입력: 트랜슬레이션 유닛
  • 출력(1)
    • 트랜슬레이션 유닛 -> 컴파일 -> 어셈블리어 코드
  • 출력(2)
    • 어셈블리어는 기계코드와 거의 1:1로 대응
  • 출력(3)
    • 어셈블리어 코드는 아직 정의를 모르는 ✭ 심볼 사용가능✭
    • 심볼: 함수나 변수의 이름 등
    • 헤더를 통한 '선언'만으로 컴파일이 가능한 이유
    • 컴파일러가 어떤 함수나 변수의 정의를 못찾을 경우
      '선언'만 보고 '구멍'만 남겨놓음!
    • 구멍을 매꾸는 것은 '링크' 단계에서 해줌

#70
어셈블리어 코드: 컴파일 플래그 -s를 쓰면 코드가 .s파일로 저장되어 있음

  • call _add -> add 함수 호출!

#71
어셈블 단계 (assembler)가 담당

  • 출력
    • 오브젝트 코드
      • 기계가 곧바로 이해 가능한 기계 코드 (기계어)
      • 이진코드
      • 어셈블리어 코드와 마찬가지로 여전히 메꿔야 하는 구멍이 있음.

#72
오브젝트 코드 보는 방법: main.o

  • c플래그 넣어서 컴파일 하면 .o 파일로 저장됨
    • 이진파일(0101..)이기 때문에 (16진수 편집기로 열 것)
    • _add 라는 레이블이 남아있음
      • 구멍을 매꾸기 위해!
profile
Hakuna Matata

0개의 댓글