TIL 231001

geon·2023년 10월 1일
0

CSAPP (p.706 ~ 715)

Linking

링킹이란

여러 조각의 코드와 데이터를 메모리로 로드해서 실행 가능한 파일로 합치는 과정
컴파일 타임, 로드 타임, 런타임에 이루어질 수 있음

링킹을 통해 seperate compilation이 가능해짐
큰 규모의 애플리케이션을 단일 소스 파일에서 관리하는 대신, 이를 작은 모듈로 분리해서 각각 변경, 컴파일할 수 있음
모듈을 수정할 때 해당 모듈만 recompile, relink하면 됨

정적 링킹

정적 링커는 relocatable object filescommand-line arguments를 받아서 fully linked executable object file을 생성함

실행 파일을 생성하기 위해 링커는 두 가지 메인 태스크를 수행함

  • Step 1 : Symbol resolution
    symbol reference를 정확히 하나의 symbol definition과 연결함
  • Step 2 : Relocation
    컴파일러와 어셈블러는 주소 0부터 시작하는 코드/데이터 section을 생성하므로 section들을 relocate하고 symbol에 대한 참조를 변경함

Object Files

object file에는 세 가지가 있음

  • Relocatable object file
    다른 relocatable object file과 컴파일 타임에 합쳐져서 executable object file이 될 수 있는 형태로 바이너리 코드와 데이터를 가지고 있음
  • Executable object file
    메모리로 복사되어 실행될 수 있는 형태로 바이너리 코드와 데이터를 가지고 있음
  • Shared object file
    특별한 형태의 relocatable object file로, 메모리에 로드되어 동적으로 링크될 수 있음

object file은 특정 파일 포맷을 따라 구성됨
현대 x86-64 리눅스/유닉스 시스템은 ELF(Executable and Linkable Format)를 사용

Symbols and Symbol Tables

relocatable object module msymbol table을 가짐
symbol tablem이 정의하거나 참조한 모든 symbol에 대한 정보를 가짐

Symbol에는 세 가지가 있음

  • module m에 의해 정의되고 다른 모듈에 의해 참조될 수 있는 global symbol (nonstatic C 함수와 전역 변수)
  • module m에 의해 참조되고 다른 모듈에 의해 정의된 global symbol
  • module m에 의해서만 정의, 참조되는 local symbol (static C 함수와 변수)
profile
뭐라도 적기

0개의 댓글