[Linux] 리눅스 환경에서의 컴파일 프로시저

Compile Procedure

  1. 소스 코드:
    • 컴파일 프로세스의 시작점으로, 프로그래머가 작성한 원시 코드입니다.
  2. 전처리기 (Precompiler):
    • 소스 코드에 전처리 지시문을 처리하는 단계입니다. 이 단계에서는 주로 #include, #define, #ifdef와 같은 전처리 지시문이 처리됩니다.
  3. 렉서 (Lexer):
    • 소스 코드를 토큰(Token)으로 분해하는 역할을 합니다. 토큰은 문법적으로 의미 있는 최소 단위로, 일반적으로 예약어, 식별자, 상수 등으로 구성됩니다. 이러한 토큰은 파서에 의해 분석됩니다.
    • 토크나이저는 어떤 구문에서 의미있는 요소들을 토큰으로 쪼개는 역할을 하고 렉서는 토큰의 의미를 분석하는 역할을 한다. Tokenizer, Lexer 의 역할을 합하여 Lexical anlyze라고 한다. Lexical Analyze란 의미 있는 조각을 검출하여 토큰을 생성하는 것을 말한다.
  4. 파서 (Parser):
    • 렉서에서 생성된 토큰들을 기반으로 문법 규칙에 따라 소스 코드의 구조를 파악하여 구문 분석하는 단계입니다. 이 단계에서는 문법 오류를 검출하고 파싱 트리(parse tree)를 생성합니다. 이때 CST와 AST(Abstract Syntax Tree)가 등장합니다.
    • 토큰 시퀀스를 입력으로 받아 문법 규칙에 따라 구문을 분석하고 이를 나타내는 트리 구조인 CST(Concrete Syntax Tree)로 생성합니다. CST는 소스 코드의 구문 구조를 표현하는 데 사용합니다.
    • CST에서 필요한 정보만 추출하여 더 추상적인 구조로 변환된 AST(Abstract Syntax Tree)를 생성합니다. CST와는 달리, 문법의 의미와 구조에 초점을 맞추어 파싱된 소스 코드를 나타냅니다. 따라서 AST는 문법적인 세부 사항을 제외하고도 소스 코드의 의미를 보다 잘 이해할 수 있도록 도와줍니다.
  5. 컴파일러 (Compiler):
    • 파싱된 소스 코드를 중간 코드로 변환하는 단계입니다. 이때 생성된 중간 코드는 기계어가 아니라 중간 언어(Intermediate language)로 표현됩니다.
  6. 어셈블러 (Assembler):
    • 중간 코드를 해당 아키텍처의 기계어로 변환하는 단계입니다. 이 단계에서는 어셈블리 언어 명령어로 표현된 기계어 코드가 생성됩니다.
  7. 링커 (Linker):
    • 정적 링킹 (Static Linking): 여러 개의 오브젝트 파일을 하나의 실행 파일로 결합하는 단계입니다. 이때 외부 라이브러리와의 연결이 직접적으로 이루어집니다. 이때 사용되는 것이 GOT(Global Offset Table)입니다.
      # gcc 옵션 중 static 옵션을 적용하면 Static Link 방식으로 컴파일 됩니다.
      $ gcc -o testfile_static testfile.c -static
      
    • 동적 링킹 (Dynamic Linking): 실행 파일이 실행될 때 필요한 라이브러리를 동적으로 로드하는 단계입니다. 이때 사용되는 것이 PLT(Procedure Linkage Table)입니다. PLT는 실제 해당 함수의 주소가 들어 있는 GOT를 참조하여 함수 주소를 얻어 옵니다.
      Dynamic Link(PLT, GOT)

      출처: https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/


      – 리눅스 환경에서 Dynamic Linking 방식으로 컴파일하는 경우, 외부 라이브러리 함수를 사용할 수 있도록 주소를 프로그램에 연결시켜주는 테이블인 PLT를 참조한다. PLT는 실제 해댱 함수의 주소가 들어있는 GOT를 참조하여 함수 주소를 얻어 온다.

      # 아무런 옵션도 주지 않는다면, 자동으로 Dynamic Link 방식으로 컴파일 합니다.
      $ gcc -o testfile_dynamic testfile.c 
      

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다