열정 실천

시스템 프로그래밍 1) 컴파일 시스템 본문

CS/시스템 프로그래밍

시스템 프로그래밍 1) 컴파일 시스템

구운오니 2022. 10. 3. 00:08

[시스템 프로그래밍]

- 컴파일 시스템 

- 런타임 시스템

- 운영체제 시스템

 

 

 

컴파일 시스템 

 

 

우리가 작성한 hello.c 파일은 인간이 이해할 수 있는 고급언어(High-Level Language)로 작성이 된 파일이고, 이 파일을 시스템에서 실행시키기 위해서는 기계가 이해할 수 있는 저급언어(Low-Level Language)로 작성된 파일로 변환해주어야 한다. 그리고 이 파일은 실행 가능한 목적 프로그램(executable object program)으로 불리는 형태로 패키지화되어 이진 디스크 파일로 저장된다. (executable object program = executable object files) Unix 시스템 gcc compiler driverhello.c 파일을 읽어 hello로 변환해줌으로써 소스 파일을 목적 파일이 되는 과정을 수행한다. 이러한 번역을 컴파일 시스템 이라고 하고 4단계에 거쳐 수행된다.

 

출처 : CSAPP

 

Preprocessing phase 전처리 단계

hello.c 소스 파일에서 # 문자로 시작하는 지시자들에 대한 처리를 한다.

- 전처리기(cpp) 사용

- hello.c -> hello.i

 

Compilation phase 컴파일 단계

어셈블리어 프로그램으로 변환된다.

*어셈블리어 : 기계어를 사람이 보기 쉽게 기호화한 것

- cc1 컴파일러 사용

- hello.i -> hello.s

 

Assembly phase 어셈블리 단계

어셈블러가 기계어로 번역하고 재배치 가능한 목적 프로그램(relocatable object program)의 형태로 묶어서 hello.o에 저장한다.

- 어셈블러(as) 사용

- hello.s -> hello.o (여기서부터 Text files (x), binary files (o) )

 

Linking phase 링크단계

외부 라이브러리와 목적 파일을 결합해주는 역할을 한다.

- ld 프로그램 사용

- hello.o -> hello

 

 

 

우리는 왜 컴파일 시스템의 작동방식을 이해해야 할까?

 

1. 프로그램 성능을 최적화하기 위해서

프로그래머로서 효율적인 코드를 작성하기 위해서 컴파일러의 내부 동작을 알 필요는 없 지만, 코드를 작성할 때 switchif-else, whilefor문 등 어느 것을 사용하느냐에 따라 효율성이 달라지므로, 가장 효율적인 코드를 작성하기 위해서 기계 수준의 코드와 컴파 일러가 C 코드를 기계어 코드로 어떻게 번역하는지는 이해하고 있어야 한다.

 

2. 연결 시간 오류를 이해하기 위해서

가장 복잡한 프로그래밍 오류 중 대부분은 링커의 동작과 관련이 있다. 특히 대규모 소 프트웨어를 빌드할 때 그렇다. 이러한 링커를 이해하고 있어야 한다.

 

3. 보안 허점을 피하기 위해서

그동안 버퍼오버플로우의 취약점은 네트워크 및 인터넷 서버의 보안 허점들을 설명해오 고 있으며, 이 취약점들은 소수의 프로그래머들만 신뢰할 수 없는 출처에서 받아들이는 데이터들을 신중하게 제한해야 한다는 사실을 인지하고 있기 때문에 발생되고 있다. 이 러한 취약점들을 막기 위한 보안 프로그래밍 학습은 데이터 및 제어 정보가 프로그램 스 택에 저장되는 방식을 이해하는 것으로 출발해야 한다.

 

 

 

 

참고자료 : CSAPP

출처 : 밥아조씨ㅋㅋ

'CS > 시스템 프로그래밍' 카테고리의 다른 글

시스템 프로그래밍이란??  (1) 2022.09.19