[OS] 프로그램 생성 및 로딩 과정

YUZAMONG·2024년 9월 8일

OS

목록 보기
1/4

컴파일링 - 링킹 - 로딩 과정

  1. 소스코드 작성 .c .cpp
  2. 전처리기 .i
  3. 컴파일러 .s
  4. 어셈블러 .o
  5. 링커 a.out .exe
  6. 로더

컴파일(Compile)

소스코드를 기계어로 변환하여 오브젝트 파일을 생성하는 과정으로, 1~4번에 해당한다.

빌드(Build)

컴파일 + 링킹 + 그 외의 전체 단계를 일컫는 말로, 코드가 실행 가능한 형태로 변환되는 과정이다.

📍 c/c++에 해당하며, 다른 언어는 전처리기와 어셈블러를 사용하지 않는 등 고유한 컴파일 과정이 있다.


1. 소스코드 작성

.c .cpp 파일을 생성한다.
사람이 읽을 수 있는 프로그래밍 언어로 작성된 코드이다.


2. 전처리기(Preprocessor)

.c .cpp 파일로 .i 파일을 생성한다.
여전히 사람이 읽을 수 있는 언어이며, 전처리 지시어들이 처리된 상태이다.
주석을 제거하고 매크로와 헤더파일을 확장한다.

  • #define으로 정의된 매크로를 실제 값으로 치환
  • #include 지시어로 포함된 헤더 파일의 내용을 실제로 소스 코드에 삽입

3. 컴파일러(Compiler)

.i 파일로 .s 파일을 생성한다.
기계어에 가까운 어셈블리어 코드로 변환한다.

기계어(Machine Language)

  • 각 기계마다 규약된 바이너리 코드(Binary Code, 0과 1)의 규칙 조합
  • CPU가 별다른 해석 없이 읽을 수 있는 언어
  • 저수준(Low-level) 언어

어셈블리어(Assembly Language)

  • 기계어와 일대일 대응 관계를 형성한 언어 ex) ADD = 0011
  • 기계어보다 한 단계 높은 저수준 언어

4. 어셈블러(Assembler)

.s 파일로 .o 파일을 생성한다.
어셈블리어를 기계어로 변환한다.

라이브러리 파일(Library File)

여러 개의 오브젝트 파일을 하나의 파일로 만든 것.
컴파일 없이 링킹만 하면 되기 때문에 컴파일 시간을 줄일 수 있고,
이미 구현되어 있는 기능들을 가져다 쓸 수 있어 개발 시간을 단축할 수 있음.
기계어 파일 모음으로 소스 코드를 보호할 수 있음.


5. 링커(Linker)

.o 파일로 a.out .exe 파일을 생성한다.
여러 개의 코드와 데이터를 연결하여 실행할 수 있는 하나의 파일로 만든다.
라이브러리를 어떻게 연결하는지에 따라 두가지 방법으로 나뉜다.

링킹(Linking)

오브젝트 파일을 실행 파일로 만드는 과정이다.

1. 정적 링킹(Static Linking)

  • .lib
  • 실행 파일 = 오브젝트 파일들 + 라이브러리 파일들
  • 실행 파일 생성 시 링킹이 이루어짐
  • 실행 파일에 컴파일된 라이브러리 코드가 포함됨
  • 파일 간에 중복되는 라이브러리가 모두 메모리에 적재됨

장점

  • 실행 시에는 실행만 하면 되기 때문에 실행 시간이 빠름
  • 코드를 분석하기 어려워 코드를 보호할 수 있음

단점

  • 실행 파일의 크기가 크고 메모리 문제가 발생할 수 있음
  • 라이브러리 소스 코드가 바뀔 때마다 매번 실행 파일을 재배포 해야 함

2. 동적 링킹(Dynamic Linking)

  • .dll .so
  • 실행 파일 = 오브젝트 파일들 + 라이브러리의 위치를 알 수 있는 포인터
  • 실행 파일 실행 시 링킹이 이루어짐
  • 실행 파일과 라이브러리가 구분되어 있음
  • 공통적으로 사용하는 라이브러리들을 메모리에 한 번만 적재함
    • 프로그램이 라이브러리 함수를 호출할 때, 메모리에 있는 함수 주소로 점프해 실행한 후 다시 돌아옴

장점

  • 실행 파일 크기가 작음
  • 라이브러리 소스 코드가 바뀌면 라이브러리만 업데이트하면 됨

단점

  • 정적 링킹에 비해 실행 시간이 느림
  • 정적 링킹에 비해 코드 분석이 쉬움
  • 점프 과정에서 오버헤드가 발생함

6. 로더(Loader)

로딩(Loading)

프로그램 실행에 필요한 데이터를 보조기억장치에서 메모리(RAM)로 옮기는 것이다.

1. 정적 로딩(Static Loading)

프로그램 실행 전에 모든 데이터를 메모리에 적재하고, 실행 중에 다른 데이터를 추가로 로드하지 않는다.

장점

  • 프로그램 실행 중 지연 시간이 없음

단점

  • 초기 메모리 사용량이 큼

2. 동적 로딩(Dynamic Loading)

프로그램 실행 중에 필요한 시점에 데이터를 메모리에 적재하고, 이후에는 메모리에서 제거한다.

장점

  • 초기 메모리 사용량을 줄여 메모리 효율성을 높일 수 있음

단점

  • 프로그램 실행 중 지연이 발생할 수 있음

📍 Paging 기법과 VMM(Virtual Memory Management)이 나오고 더 이상 사용하지 않게 되었다.


References

https://velog.io/@hey-chocopie/Libasm-2.-어셈블리어란-개념-및-특징-정리-명령어-정리
https://velog.io/@carrykim/프로그래밍-언어
https://reminder-by-kwan.tistory.com/148
https://byunghyun23.tistory.com/2
https://rannnneey.tistory.com/entry/운영체제-Memory-Management-2-동적-로딩-동적-링킹-오버레이-스와핑

profile
유자맛 찹쌀유과

0개의 댓글