Chapter 2-5

윤강훈·2024년 12월 16일

Computer Architecture

목록 보기
11/11

Linking

이번 Chapter에서는 Linking 이라는 개념에 대해 알아볼 것입니다. 말만 거창하지 사실 크게 어려운 부분은 아닙니다.

위와 같이 두 개의 c 파일이 있다고 해 보겠습니다. C언어를 배운 적이 있는 사람들은 알겠지만, 저 두 파일은 서로 연결되어 하나의 프로그램이 될 수 있습니다.

그럼 여기서 main은 어떻게 swap 함수를 가져다 쓰고, swap에서는 어떻게 다시 main으로 돌아갈까요?

이 질문에 대한 대답이 바로 Linking 입니다.

What is Linking?

Linking의 정의는 아래와 같이 내릴 수 있습니다.

컴파일러에 의해 만들어진 relocatable object files를 합쳐서 하나의 실행 파일을 만드는 것

여기서 이 Linking을 수행해주는 프로그램을 Linker 라고 부릅니다.

Kind of Object Files

아래에서 linking에 대해 자세히 설명하기 전에 object file의 3가지 종류에 대해서 알면 좋을 거 같습니다.

  1. Relocatable object file (.o file): 코드와 데이터를 포함합니다.

  2. Executable object file (a.out file): 실행 파일입니다.

  3. Shared obect file (.so file): Library처럼 Share 되는 파일입니다.

Static Linking

Linking에도 종류가 있습니다. 그 중 하나가 Static Linking 입니다. 이는 compile time에 끝이 납니다.

아래는 static linking을 잘 나타내는 그림입니다.

각각의 object file은 3개의 영역을 가지고 있습니다.

  1. Text: 실행 코드가 저장되는 영역
  2. Data: 초기화된 전역 변수와 정적 변수가 저장되는 영역
  3. bss: 초기화 되지 않은 전역 변수와 정적 변수가 저장되는 영역

Linking이 진행됨에 따라 각각의 파일들의 같은 영역끼리 묶어서 다시 새로운 파일(실행 파일)을 만들게 됩니다. 이러한 특징 때문에 relocatable object file이라고 불리는 것 입니다.

Static Linker

Static Linker는 두가지 역할을 수행합니다.

  1. Symbol resolution: 위에서 3가지 영역이 있다고 하였는데, 이에 맞게 분류하는 작업을 합니다.

  2. Relocation: 분류된 것들을 메모리에 재배치하는 역할을 합니다.

Dynamic Linking

Linking 방식 중 남은 하나는 Dynamic Linking 입니다. 이는 프로그램이 메모리에 로드될 때 Linking을 수행하는 방식입니다.

대표적인 예로는 라이브러리를 들 수 있는데, 모든 코드에서 다 사용되는 라이브러리 같은 경우 일일이 라이브러리를 지정하는 것보다 마지막에 한 번에 Linking을 통해 적용하는 것이 개별 프로그램의 사이즈를 줄이는 데 도움이 될 것입니다.

Dynamic Linker

Dynamic Linker 는 Static Linker와 비슷하지만 조금 다른 역할을 수행합니다.

  1. 공유 라이브러리 로드: libc.so와 같은 라이브러리를 찾아 메모리에 올려 놓습니다.

  2. Symbol 결합: printf() 함수는 libc.so에 정의되어 있으며, Linker가 함수를 연결합니다.

  3. Relocation: static linker와 같은 역할을 합니다.

Why Linkers?

그럼 의문이 들 수 있습니다. Linker는 왜 사용해야하는 거냐? 크게 2가지 이유가 있습니다.

  1. Modularity: 프로그램을 작은 소스 파일들로 나누어 작성할 수 있습니다. 이 또한 3가지 이점이 있습니다.

    1. 개발의 편리함: 소스 파일을 독립적으로 작성 및 관리 가능

    2. 재사용성: 공통 사용 함수들을 라이브러리로 만들어 여러 프로그램에서 재사용 가능

    3. 협업 가능: 여러 개발자가 서로 다른 소스 파일을 독립적 작업 가능

  2. Efficiency

    1. Time: 수정된 파일만 recompile하면 되기 대문에 시간을 절약할 수 있습니다. 또한 여러 파일들을 동시 컴파일 할 수 있기 때문에 시간을 단축할 수 있습니다.

    2. Space: 실행 파일에는 실제 사용 함수만 포함되므로 크기가 작아집니다. 또한 공유 라이브러리를 동시에 사용하여 메모리를 효율적으로 사용할 수 있습니다.

Variables

Variable(변수)에는 Life와 scope라는 개념이 존재합니다. Life는 변수가 지속되는 시간, Scope는 변수가 적용되는 범위라고 생각하면 될 거 같습니다.

  1. Global Variable
    • Life: 프로그램이 종료될 때까지
    • scope: 프로그램 전역
  2. Static Variable
    1. File scope
      • Life: 프로그램 실행 동안 유지
      • Scope: 선언된 파일 내에서만
    2. Function scope
      • Life: 프로그램 실행 동안 유지
      • Scope: 선언된 함수 내에서만

Symbols

Symbol은 Linking에서 사용되는 개념이며, 4가지 종류의 variable 또는 function을 참조합니다.

  1. Function names
  2. Global variables
  3. Static variables
  4. Static local variables

또한 Symbol은 3가지 종류가 존재합니다.

  1. Global symbols: 다른 모듈에서 사용 가능하도록 정의된 심볼

    1. non-static C functions: void f();
    2. non-static global variables: int n;
  2. External symbols: 다른 모듈에서 정의된 것들을 참조하기 위해 정의된 심볼

    1. extern void f();
    2. extern int n;
  3. Local symbols: 특정 module/function에서만 사용 가능한 심볼

    • static local variables

Strong and Weak

심볼에도 level이 존재합니다. strong과 weak로 나누어집니다.

  1. Strong: 함수 이름, 초기화된 symbol
  2. Weak: 초기화되지 않은 symbol

Rules

심볼에도 규칙이 있습니다.

  1. 같은 이름을 가진 두 개 이상의 strong symbol은 허용되지 않음
    • Linker error 발생
  2. 하나가 strong, 나머지들이 weak인 경우는 strong 기준으로 실행
    • No error
  3. weak만 여러개인 경우는 랜덤하게 선택됨.
    • No error
profile
Just do it.

0개의 댓글