[CSAPP] Linker 7.2 Static Linking

JunHyeok Kim·2024년 4월 22일

정적 연결 (Static Linking) 이란 무엇일까?

'리눅스 LD 프로그램'과 같은 정적 링커들은 재배치 가능한 목적파일들과 명령줄 인자 (command-line arguments)를 입력으로 받고, 실행될수 있는 완전한 목적파일을 출력으로 생성한다.

실행 파일을 만들기 위한 링커의 두 가지 주요 작업

  1. Symbol resolutin (심볼해석)

    심볼은 함수, 전역변수, static 으로 선언된 모든 변수들을 심볼 정의에 연결한다.

    The purpose of symbol resolution is to associate each symbol reference with exactly one symbol definition.

    즉, 각각의 함수, 전역변수, 정적 변수들을 각각의 '심볼 정의'에 대응 시키는 것으로 생각하자!

  2. Relocation (재배치) :
    컴파일러와 어셈블러는 주소 0번지에서 시작하는 코드와 데이터 섹션들을 생성한다. 링커는 이 섹션들을 각 심볼 정의와 연결시켜서 재배치 시키고, 이 심볼들로 가는 모든 참조들을 수정하여 심볼의 메모리 위치를 가르키도록 한다. 링커는 'Relocation entries (재배치 엔트리)'라고 부르는 어셈블러가 생성한 상세한 지시사항들에 따라 이러한 재배치 작업을 수행한다.

링커 단원을 공부할 때 필요한 기본사항

  • 목적파일들은 단지 바이트 블록들의 집합이다. 이 블록들 중 일부는 프로그램 코드를 포함하고, 다른 블록들은 프로그램 데이터를, 다른 블록들은 링커와 로더를 안내하는 데이터 구조를 포함한다.
  • 링커는 블록들을 함께 연결하고 이 연결된 블록들을 위한 런타임 위치를 결정하며, 코드와 데이터 블록 내에 여러 가지 위치를 수정한다.

0개의 댓글