C 프로그램 번역과 실행

2024. 11. 14. 11:15

C로 쓰인 프로그램을 컴퓨터가 실행할 수 있는 프로그램으로 변환하기 위한 4단계를 설명한다.

Translation Hierarchy

1. Compilation

컴파일러C 소스 코드 (.c) → 어셈블리 코드 (.s)를 수행한다. (A+B → add A, B)

  • 어셈블리 언어: binary machine code로 번역할 수 있는 기호화된 언어이다.

2. Assembly

어셈블러어셈블리 코드 (.s) → 목적 파일 (.o)를 수행한다.
어셈블리 코드를 기계어로 변환하여 목적 파일을 생성한다. (add A, B → 1001010100101110)

  • Pseudoinstruction(의사명령어): 실제 하드웨어에서 지원되지 않는 어셈블리 언어의 명령어를 어셈블러가 마치 존재하는 것처럼 처리하여 변환하는 명령어 (ex. move, li, bge 등)
  • 목적 파일(object file): 기계어로 번역된 명령어, 데이터, 명령어를 메모리에 배치하기 위해 필요한 각종 정보들이 섞여 있다.
  • symbol table: 어셈블러가 프로그램의 레이블 이름과 해당 메모리 주소를 대응시키기 위해 유지하는 테이블로, branch와 데이터 전송 명령어에서 사용되는 레이블의 주소를 기록한다.

3. Linking

링크 에디터(또는 링커)목적 파일 (.o) + 라이브러리 → 실행 파일 (.out)을 수행한다.
여러 목적 파일과 라이브러리를 결합하여 실행 가능한 단일 파일을 생성한다.

  • 따로따로 어셈블된 기계어 프로그램을 하나로 연결해 주는 일을 한다.
    • 따로따로 어셈블 하는 이유: C 소스 코드를 한 줄이라도 고치면 전체를 재컴파일, 재어셈블 해야하기 때문에 각 프로시저를 따로 컴파일, 어셈블하여 합친다.

링커의 동작은 3단계로 이루어진다.

  1. 심볼 로딩: 여러 코드와 데이터 모듈을 메모리에 심볼(레이블) 형태로 불러온다.
  2. 주소 할당: 각 심볼이 실제 메모리에서 차지할 위치를 결정한다. 함수와 변수들이 사용할 정확한 메모리 주소가 정해진다.
  3. 참조 해결: 코드 내부와 외부의 참조를 연결하여 심볼이 실제 메모리 위치를 가리키게 한다. 다른 파일에 정의된 함수나 변수에 대한 참조를 정확히 연결해 프로그램이 올바르게 작동할 수 있도록 한다.
    이 과정을 통해 여러 모듈이 하나의 실행 파일로 결합되고, 모든 참조가 올바른 메모리 주소를 가리키게 된다.

4. Loading

로더가 생성된 실행 파일을 메모리에 적재하여 프로세서가 이를 실행할 수 있게 한다.

 

본 정리는 컴퓨터 구조 및 설계 RISC-V (2판)을 중심으로 다양한 자료를 참고하여 작성되었습니다.
일부 내용에 오류가 있을 수 있습니다.