Linking(링킹) 소개

mydailylogs
|2022. 12. 2. 17:11

링킹

링킹은 여러 개의 코드와 데이터를 모아 연결하여 메모리에 로드될 수 있고 실행될 수 있는 하나의 파일로 만드는 작업이다. 링킹은 컴파일 시에 수행될 수 있으며, 이때 소스 코드는 기계어로 변환된다. 프로그램이 메모리에 로드되고, 로더에 의해 실행될 수 있을때에는 로드 타임에, 응용 프로그램에 의해서 심지어 실행 시에도 수행될 수 있다. 초기 컴퓨터 시스템에서는 주로 수동으로 링킹이 이뤄졌지만, 현대의 시스템에서는 링커라고 부르는 프로그램에 의해 자동으로 수행된다.

다음의 예시를 통해 링커를 이해해보자.

/* main.c */
void swap();

int buf[2] = {1, 2};

int main()
{
    swap();
    return 0;
}
/* swap.c */
extern int buf[];

int *bufp0 = &buf[0];
int *bufp1;

void swap()
{
    int temp;
    
    bufp1 = &buf[1];
    temp = *bufp0;
    *bufp0 = *bufp1;
    *bufp1 = temp;
}

 앞서 작성된 프로그램은 두 개의 소스파일 main.c swap.c로 구성된다. main 함수는 두 원소를 갖는 int의 배열을 초기화하고, 이들을 교환하는 swap 함수를 호출한다.

해당 파일들을 메모리에 로드가 가능한 프로그램으로 변환하기 위해서는 컴파일러를 활용하여 먼저 각각의 소스파일을 .o 형태의 목적파일로 변환하고 이를 링커를 사용하여 하나로 묶는 작업이 필요하다. 그림으로 표현하면 다음과 같다.

 

링킹의 장점

링킹의 장점을 나열하자면 다음과 같다.

모듈화

  • 하나의 거대한 소스코드 대신에, 각각의 모듈로서 파일을 분리하므로 모듈화의 장점 (더 작은 단위로 관리, 라이브러리를 통해 반복된 코드 재사용 가능)을 얻을 수 있다.

효율성

  • 하나의 소스 파일에 변경이 되었다면, 굳이 모든 소스를 다시 컴파일하는 대신, 해당 소스 파일만 다시 컴파일하고 이를 다시 re-link하면 된다.
  • 라이브러리를 사용하기 때문에, 공통된 파일에 여러 함수들을 담아 둘 수 있으며, 실제 파일을 작성할 경우 라이브러리 함수를 가져와서 실제 사용될 라이브러리 함수와 본인 소스 코드만이 코드에 포함되게 된다.

 

'CS' 카테고리의 다른 글

정적 라이브러리  (0) 2022.12.05
실행가능한 목적파일  (0) 2022.12.03
시간 지역성을 위한 캐시 재배치  (0) 2022.12.01
공간 지역성을 높이기 위한 루프 재배치  (2) 2022.12.01
캐시 친화적 코드 작성하기  (0) 2022.11.29