ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS].c 파일 빌드~실행 전체적인 과정
    운영체제 2025. 3. 23. 10:46

    Overview


    .c 파일 빌드 과정

    - Compiler, Assembler, Linker 순으로 진행된다.

    1. Compiler

    .c 파일을 어셈블리어로 바꾼다.

    2. Assembler

    어셈블리어 코드를 바이너리 코드로 변환한다.

    변수, 함수의 주소를 할당한다.

    3. Linker

    여러 오브젝트 파일 (.o)과 라이브러리 파일(.a)을 결합하여 하나의 파일을 만든다. 

    어셈블러에서 할당 못한 변수,함수의 주소를 할당하며 Symbol table을 업데이트해준다. (아래에서 자세히 설명한다)

     

    상세 파일 설명

     

    - 어셈블러에 의해 만들어진 .o 파일이다. 실제로는 이진수로 되어있다.

    - 각각 함수 A와 함수 B가 서로 다른 .o 파일에 들어가 있다.

    - Text segment : 명령어와 그 주소가 들어간다.

    - Symbol table : 주소 할당이 아직 안된 함수,변수,명령어가 들어간다. 예를들어 다른 .o파일에 있는 변수나 함수, 전역변수, printf같은 표준 C 라이브러리 함수 등이 있다. 이것들을 Label이라 부르는데, 이 부분은 나중에 링커에 의해 할당된다.

    - Data segment : Symbol table의 Label에 의해 주소 할당이 덜 된 명령어들이 들어간다.  

     

     

    - 링커에 의해 두개의 .o 파일이 합쳐진 모습이다. 함수 A와 함수 B가 합쳐졌다.

    - Text segment : .o에서 주소할당이 덜 된 명령어들의 주소를 수정한다.

    - Data segment : .o의 Symbol table에 있던 Label의 주소를 할당한다.


    빌드 & 실행 과정

    - 로더에 의해 빌드된 코드가 메모리에 적재되고, CPU에 의해 코드가 실행된다. 

     

    loader

    빌드가 완료된 실행 파일(.out)과 동적 라이브러리 파일(.so)을 메인 메모리에 할당한다

     

    메모리 할당 방법

    - 로더가 파일을 메모리에 할당할 때, 여러 요소들을 각기 다른 영역에 할당한다.

    stack : 지역변수 값과 함수의 인수 값들

    heap : 동적할당 값들

    static : 전역변수 값들

    text : 실행파일(.out)

     

     

     

     

     

     

    1~2. outer()의 지역변수 저장 

    3. inner()의 매개변수 저장

    4. outer()의 리턴 주소 저장 (inner() 실행이 끝나면 되돌아갈 outer() 코드 위치 저장)

    5~7 inner()의 지역변수 저장

     

     

    1~2. outer()의 지역변수 저장

    3. inner()의 매개변수 저장

    4. outer()의 리턴 주소 저장 (inner() 실행이 끝나면 되돌아갈 outer() 코드 위치 저장)

    5~7. Heap 메모리에 inner()의 동적 할당 변수 저장

     

     

     

    참고 : https://os.phil-opp.com/heap-allocation/

Designed by Tistory.