ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 질문정리 ( C 언어의 컴파일 과정 )
    면접 준비/언어 2018. 11. 20. 20:37

    먼저 정리하기에 앞서 

    Peter's Blog 분의 포스팅을 보고 정리한 것입니다! 혹시 문제가 된다면 비공개로 전환하겠습니다.


    컴퓨터 구조 쪽에 속하는 건지 모르겠지만 일단 정리.. 




    [ C언어의 컴파일 과정 ] 



    마지막에 생성되는 실행파일을 실행하면 바이너리 파일의 내용들이 주기억장치(RAM)에 Load되어 시스템에서 동작


    여기서 happy.c 는 소스코드, happy.i 는 확장된 소스 코드를 포함한 중간 파일, happy.s 는 어셈블리 파일, happy,o 는 오브젝트 파일이다.


    1. 전처리 과정


    전처리 과정은 다음의 2개의 부분으로 나눌 수 있다.

    1) 헤더 파일 삽입

    #include 구문 부분의 해당하는 헤더파일을 찾아서 그 파일의 내용을 삽입한다.

    2) 매크로 치환 및 적용

    헤더파일이 모두 삽입되면 매크로 치환 작업이 시작된다. #define 된 부분은 심볼 테이블에 저장되고 심볼 테이블에 들어있는 문자열과 같은 문자열을 만나면 #define 된 내용으로 치환된다.


    ※ 심볼 테이블이란?

    심볼은 함수명, 변수명을 말하며 다른말로 식별자(identifier)라고도 말한다.

    심볼 테이블이란 변수명과 번지를 연결해주는 테이블로 컴파일 할때 자동적으로 생성되는 테이블이다.


    2. 컴파일 과정


    전처리 과정이 끝나고 컴파일 과정이 시작된다.

    전처리 과정은 다음의 3개 부분으로 나눌 수 있다.

    1) 전단부 (front-end) - 소스 코드에 에러가 있는지 체크한다.

    2) 중단부 (middle-end) - 아키텍처와 상관 없는 최적화를 시킨다. (SSA 기반으로 최적화)

    3) 후단부 (back-end) - 해당 아키텍처와 관련있는 최적화를 시키고 어셈블리어로 변환 시켜준다.


    ※ 왜 최적화를 하는가?

    최적화를 수행하면 컴파일 시간이 오래걸려도 프로그램의 수행속도를 향상시켜 전체 시스템 성능의 효율을 높여주기 때문


    3. 어셈블 과정


    컴파일이 끝나면 어셈블리 파일(happy.s)은  어셈블러에 의해 기계어로 어셈블된다.

    이렇게 생성된 목적 파일, 오브젝트 파일(happy.o)은 어셈블된 프로그램의 명령어와 데이터가 들어있는 ELF 바이너리 포맷(Binary format) 구조를 갖는다.


    다음 단계에서 링커가 여러개의 바이너리 파일을 하나의 실행 파일로 묶기 위해 바이너리의 정보를 효과적으로 파악하기 위해 일정한 규칙을 갖도록 형식화 한 것이다.


    4. 링킹 과정


    어셈블리에 의해 ELF 구조의 목적 파일, 오브젝트 파일(happy.o)이 만들어지면 링커는 오브젝트 파일들과 표준 c라이브러리, 사용자 라이브러리들을 link 한다.


    ex ) printf(), scanf()등 표준 라이브러리 함수들은 미리 컴파일이 되어있기 때문에 링크하는 과정만 거치면 된다.





      

Designed by Tistory.