이 과정은 크게 4 단계 를 거쳐서 번역 된다.
#include <stdio.h>
를 통해서 printf, scanf와 같은 것을 정리#include
: #이후의 디렉티브 지시자, 전처리기에게 헤더 파일을 직접 삽입하라
stdio.h
: standard input output, h: 파일의 확장자를 나타냄, 시스템 헤더파일
이는 다음과 같은 명령어로 설명할 수 있다.
gcc -E hello.c -o hello.i
하나하나 알아보자
gcc
: GNU project C and C++ compiler
-E
: 전처리 단계까지만 하고 컴파일은 그만 둠
-o
: 아웃풋 파일을 적어라!
직접 보니까 이런 문장들이 적혀 있다!
# 1 "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h" 1 3 4
아직까진 text file이라고 볼 수 있다!
현재 까지의 상황
├── 1_source
│ └── hello.c
├── 2_cpp_modified_source_program
│ └── hello.i
├── 3_cc1_compiler
│ └── hello.s
├── a.out
├── hello
├── hello.c
├── hello.i
├── hello.s
├── howtoUse.txt
└── z_sample_for_exact
cc1은 텍스트파일 hello.i --> 어셈블리어 프로그램이 저장
어셈블리어(영어: assembly language) 또는 어셈블러 언어(assembler language)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.
컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각이며, 레지스터의 크기와 개수, 저장된 데이터 형의 표현도 각기 다르다. 모든 범용 컴퓨터는 기본적으로 동일한 기능을 수행하지만, 기능을 어떤 과정을 거쳐 수행할지는 다를 수 있으며, 이런 차이는 어셈블리어에 반영되게 된다.
아무래도 컴퓨터가 달라지면 어셈블리어도 달라지게 되는 갑다.
1) 번역
2) 재배치 가능 목적 프로그램의 형태로 묶어서 hello.o
목적파일, object file에 저장한다
x86 계열 CPU 기계어 명령: 10110000 01100001
어셈블리어로 옮겨 쓰면: mov al, 061h
: 16진수 61을 al 레지스터에 옮겨라!
al은 cpu 안에 변수를 저장하는 레지스터 중 하나
와씨 이사람 빡세게 공부 했네
빡센공부
근데 아무래도 arm 환경의 m1 이다 보니 어셈블리어 프로그램이 살짝 이상하게 보일 수도 있겠다라는 생각이 조금 든다
printf.o
라는 파일에 들어 있는데 이게 hello.o
파일과 어떻게든 결합을 해야한다 ld
가 이 통합 작업을 수행! 근데 왜 모든 stage를 다 뽑아 보라고 하면 이렇게 되는 거지 ?
gcc -save-temps hello.c