Compilation Process
- Processing phase
원본 C프로그램을 '#'으로 선언된 경로에 따라 수정하는 단계.(* .c → .i 확장자)
- Compilation phase
C프로그램을 어셈블리 언어 프로그램으로 번역하는 단계.(* .i → .s 확장자)
- Assembly phase
어셈블리 언어 프로그램을 기계어 프로그램으로 번역하는 단계.(* .s → .o 확장자)
- Linking phase
실행 파일을 만들기 위한 필수적인 객체들을 병합하는 단계. printf.o와 같은 객체들을 병합하는 단계입니다.(* .o → .exe 확장자)
위 단계를 그림으로 보면 다음과 같습니다:
GNU Compiler Collection(* GCC)
GCC를 통해 컴파일 시킬 수 있습니다.
파일안에 p1.c와 p2.c 코드들이 있다고 했을 때, 아래의 그림과 같이 컴파일 할 수 있습니다:
전체 컴파일 명령어는
gcc -og p1.c p2.c -o p
입니다.
gcc: 컴파일 명령어
-0g: 기본 최적화 방법
p1.c, p2.c: 컴파일 할 코드 이름
-o p: p라는 이름으로 실행파일(* .out)을 만듭니다. 만약 이를 설정하지 않는다면 a.out으로 만들어집니다.
위 그림과 같이 gcc -E, gcc -S, gcc -c와 같은 명령어를 통해 특정 단계까지만 컴파일 할 수 있습니다.
C → Assembly
gcc -0g -S sum.c
명령어를 통해 C → Assembly 단계를 볼 수 있습니다.
해당 단계는 기계마다 다른 결과를 낼 수 있습니다. 즉 최적화 방법(* 0g)이나 기계의 상태에 따라서 어셈블리 코드가 달라질 수 있습니다.
// C
long plus(long x, long y);
void sumstore(long x, long y, long *dest)
{
long t = plus(x, y);
*dest = t;
}
// Assembly
sumstore:
pushq %rbx
movq %rdx, %rbx
call plus
movq %rax, (%rbx)
popq %rbx
ret
Object Code
Assembler를 통해 .s(* Assembly file) 에서 .o(* Machine Code file) 파일로 번역합니다.
각각의 명령들은 Binary encoding이 되어있고, 실행 가능한 코드와 매우 근접하게 encoding되어있습니다. 단지 다른 파일들의 코드들과의 연결이 빠져있습니다.
Linker를 통해서 그 빠져있던 연결을 이어줍니다. 이때 다른 파일에 있는, Linker에 의해 연결되는 라이브러리는 malloc, printf 와 같은 코드들이 이에 해당합니다. 몇몇 라이브러리들은 사전에 정적으로 연결(* malloc, printf, etc.)되지 않고 동적으로 실행됐을 때 연결되기도 합니다.
// Assembly
sumstore:
pushq %rbx
movq %rdx, %rbx
call plus
movq %rax, (%rbx)
popq %rbx
ret
// machine code
0x0400595:
0x53
0x48
0x89
0xd3
0xe8
0xf2
0xff
0xff
0xff
0x48
0x89
0x03
0x5b
0xc3
Disassembler
objdump -d sum
과 같은 명령어를 통해 수행할 수 있습니다.
목적 코드를 테스트할 때에 유용한 도구로 사용됩니다. 큰 패턴의 명령 나열을 분석하고, 최대로 근사된 어셈블리 코드를 생성합니다.
이는 a.out과 같이 완전 실행가능한 파일이나, .o(* machine code file)에서 사용할 수 있습니다.
// Machine Code -> Assembly language
0000000000400595 -> <sumstore>:
400595: 53 -> push %rbx
400596: 48 89 d3 -> mov %rdx,%rbx
400599: e8 f2 ff ff ff -> callq 400590 <plus>
40059e: 48 89 03 -> mov %rax,(%rbx)
4005a1: 5b -> pop %rbx
4005a2: c3 -> retq
어셈블리 언어에서 c언어로도 Diassembler같은 것을 수행할 수 있지만, 저작권의 문제나, 정확성의 문제때문에 사용하지는 않습니다.
'[학교 수업] > [학교 수업] 시스템 프로그래밍' 카테고리의 다른 글
[시스템 프로그래밍] Signal Programming (0) | 2024.09.24 |
---|---|
[시스템 프로그래밍] Signals (0) | 2024.09.20 |
[시스템 프로그래밍] Linux Commands (0) | 2024.09.20 |
[시스템 프로그래밍] Multi-process Programming (0) | 2024.09.11 |
[시스템 프로그래밍] Processes (0) | 2024.09.05 |