본문 바로가기

카테고리 없음

gcc

반응형
*참고자료 : 유닉스 리눅스 프로그래밍 필수 유틸리티(개정판)

1. C소스 전체 컴파일 과정 요약
  가. gcc -|- cpp0 or cc1 -E : 전처리
                 |- cc1 : 컴파일
                 |- as : 어셈블러
                 |- collect2 or ld : 링커
  나. 순서도
               전처리기                c컴파일러                 어셈블러                     링커
    like.c ---------------> like.i  ---------------> like.s  ---------------> like.o  --------------> like
           cpp0 or cc1 -E                 cc1                             as                    ld or collect2

2. 전처리
  가. 과 정
    #include 된 헤더 찾기 -> 헤더 복사 -> #define 전처리기 대체
  나. 특이 사항
    1) #ifdef 같은 경우 운영제체별로 사용되는 헤더 및 코드가 달라질때도 사용한다.

3. 어셈블리 소스로 컴파일
  가. 과 정
    1) 전단부
      가) 코드의 어휘(지정된 토큰(if, while, main, +, -, * 등)으로 나눠서 파서에 전달), 구문(문법),
            의미(선언되지 않은 변수 같이 정상 문법의 오류)상 오류 확인
      나) GIMPLE 트리 생성
    2) 중단부
      가) GIMPLE 트리 ---------------------------------> RTL(C언어와 어셈블리어 중간 형태) 생성
                                   아키텍처 비종속 최적화
    3) 후반부
      가) RTL  --------------------------------------------------------> 어셈블리 코드 생성
                     일부 아키텍처 비종속 + 아키텍처 종속 최적화
  나. 용어 정리
    1) 중간 표현
      cc1에서 내부적으로 사용되는 표현으로 언어 종속적 부분(GIMPLE 트리)과 기계 종속적 부분(RTL)을
      분리하여 컴파일러를 모듈화하고 최적화를 쉽게 하기 위해 사용
    2) 중간 표현 종류
      가) GIMPLE : 여러 프로그래밍 언어 소스를 공통된 언어 표현으로 바꾼 후 소스 코드를 트리 형태로 표현된다.
      나) RTL(Register Transfer Language) : 레지스터 전송 언어로 3-address 코드 형태이며,
            레지스터 레벨의 연산과 오프랜드로 표현된다.

4. 기계어 코드
  가. 내 용
    1) like.s의 인스트럭션 + 데이터를 포함하는 ELF binary format
    2) ELF binary format
      가) 설 명
        실행파일이 실행될 때, 메모리에 어떻게 올리고 어디부터 실행시킬지에 대한 결정 근거
      나) 구조 및 주요 구역 설명
        (1) ELF Header : endian, OS, cpu 관련 정보 및 하위의 각 구역 시작위치와 크기 정보가 있다.
        (2) .text : like.c의 인스트럭션
        (3) .data : like.c의 data
        (4) .rodata : 변하지 않는 read only data(ex) "Hellow world!!.\n")
    
  3) print()는 내부적으로 puts()로 변경된다.

5. 링킹
  가. 내 용
    1) like.o + 표준 c라이브러리와의 링킹
  나. 표준 c라이브러리
    1) 정적 라이브러리
      가) puts(), printf(), read(), memcpy() 등의 함수들이 각각이 ELF 오브젝트 형태로 모인 구조.
      나) .a 의 형태이며 /usr/lib에 위치
    2) 공유 라이브러리
      가) 함수들이 모여 하나의 ELF 오브젝트를 구성하는 구조


반응형