본문 바로가기

별걸다하는 IT/운영체제 OS

[OS]링킹(Linking)이란? 링커(Linker)란? 컴파일 과정,목적파일, 빌드과정

반응형

운영체제 목차

 

메모리 관리를 시작하기 앞서 

메모리 관리와 관련된 몇 가지 단어들이 나오는데 이런 단어들을 이해를 못하고 있으면 안됩니다.

 

Linking에 대해서는 프로그램 컴파일에 대해서 배웠으면 당연히 알고 있어야 해요!! 

Dynamic Linking 과 Static Linking 또한 알고 있어야합니다.

 

아시는 분들은 이번 포스팅은 그냥 가볍게 읽고 넘기면 되겠숩니다

모르는 분들이나 다시 상기시키기 위해서 가볍게 포스팅하고 넘어갈게요 

 

이번 포스팅은 Linking에 대해서 (사실 운영체제 과목 내용은 아니지만 이해를 돕기 위해 진행하는 포스팅)

다음 포스팅은 Dynamic Linking과 Static Linking에 대해서 살펴볼게요 

 

프로그램 빌드 과정- 컴파일 과정

링킹은 프로그램을 빌드 하는 과정에서 (즉 컴파일 과정에서 거치는 단계이죠) 이뤄지는 말그대로 링크하는 과정입니다.

 

[그림1]

이 전체를 크게 컴파일 과정이라고 해요.

작은의미의 컴파일로써는 저기 적혀있는 Compile 있죠? 저 구간을 컴파일이라고 합니다.

즉 Compiling + Linking 이 전 구간을 큰 의미의 컴파일, 저 Linking 구간을 제외한 Compiling 부문을 작은 의미의 컴파일이라고 지칭합니다.

 

운영체제는 C/C++언어와 그래도 연관이 깊으므로 C언어로 예를 들어볼게요 

대략 이렇게 우리가 코드를 짰다고 합시다. 그럼 이게 소스파일이예요. Source.cpp (이름.cpp)이렇게 저장되는 파일!

소스파일은 C언어나 java 등 이렇게 우리 인간들, 프로그래머들이 이해하기 쉽게 고급언어로 작성된 파일을 말합니다.

 

그리고 빌드하면! (비쥬얼 스튜디오에서는 Ctrl + shift + b) 

실제로 저런 과정(컴파일링 후 링킹 과정)을 얘네가 내부에서 진행한 후에 .exe파일을 딱 내보내주는거예요.

int x = 10;

int y = 20;

int result;

int add (int x, int y)

{

return x+y;

}

void main()

{

int sum = x+y;

result = add(x,y);

}

[소스파일]

저는 test라는 프로젝트를 생성해서 이와 같이 작성 후 빌드를 시켜줬는데요 

폴더에 들어가서 확인해보면

 

 

 

 

 

 

Test폴더 안 Debug 폴더에 Source.obj라는 파일은 작은 의미의 Compiling을 거친 후 생성된 Object code를 의미하고

Debug폴더 안에 보면 test.exe파일은 링킹 과정 후에 생기는 실행 파일을 의미해요

실행파일은 익숙하죠?! 실행파일이 만들어지는 과정은 이와 같습니다.

 

지금 현재는 source파일이 하나밖에 없어서 컴파일 과정을 거친 .O(오브젝트 파일=목적파일)은 Source.obj하나밖에 없네요 

하지만 실제로 컴파일 과정을 거치면 [그림1]처럼 .O파일이 여러개 각 소스파일 당 한개씩 생깁니다.

 

 

목적 파일 (Object File) 오브젝트 파일

 

소스파일은 우리가 이해하기 쉬운 언어들이지 컴퓨터가 이해할 수 있는 언어는 아니예요.

그렇기 때문에 컴퓨터가 실제로 이해하고 실행하기 위해서 Low Level언어, 이진수 파일로 변환해줘야 하는 과정을 거쳐야합니다. 이렇게 변환하는 것을 과정을 Compiling이라하고 변환해주는 애를 Compiler라고 해요 

이렇게 컴파일 과정 뒤에 생긴 Low level언어의 파일이 목적파일입니다. 

목적파일은 기계어로 작성된 로직과 실행하는데 필요한 부가 정보들 (디버깅 정보나 Symbol 정보등등)들로 이루어져있습니다.

목적파일은 실행파일과 소스의 중간단계인거죠.

 

Text segment, Data segment 뭔가 익숙하죠?

이 포스팅에서 우리 배웠었어요. 우리 작성한 코드들(명령어)의 이진정보가 Text segment로 들어갑니다. 

 

Data segment contains binary representation of data in assembly file

- Data section은 전역변수나 static 변수들이 저장되는데 좀 더 자세하게는 안에 Data section과 BSS Section을 나눠서 BSS에는 초기화되지 않은 전역변수와 static 변수들이 들어갑니다. .오브젝트 파일이 링킹 과정을 거쳐서 실행파일이 되는거니까

목적파일에도, 실행파일에도 이 데이터들이 포함됩니다.

 

Symbolic table은 컴퓨터 구조시간에 배웠던 그 symbol이 맞습니다. Symbol들의 주소와 정보들을 쉽게 찾을 수 있도록 한 곳에 모아둔 테이블이 Symbol 테이블이예요.

Relocation 정보 또한 symbol 심볼 정의와 심볼 참조를 연결하기 위한 테이블이예요. (symbol주소와 PC 상대 주소의 매칭 테이블임) 이부분은 컴퓨터 구조의 어셈블리어에서 배우니까 나중에 시간되시면 추가적으로 찾아서 공부하시길 권해드려요. :)

 

그리고 실제 오브젝트 파일을 열어보면 이와 같이 보여요 우리가 알아볼수없는건 당연합니다. 컴퓨터가 알아볼 수 있도록 바꾼거니까요 ~ㅎㅎ

 

링커(Linker)의 링킹(Linking) 과정

 

 

출처: https://www.webopedia.com/definitions/link/

이렇게 만들어진 Object file들을 링커가 링킹해서 실행파일로 만듭니다!

 

그림을 보니까 대략 목적파일과 라이브러리 파일들을 링크(더한게)한게 실행파일이라는 거 같죠? 맞습니다 ㅎㅎ

 

컴퓨터가 점점 발전함에 따라 디스크의 욕량도 늘어나고~ 램의 성능도 늘어나구~ 그러다보니 프로그램의 크기도 늘어나구~

소스코드 양이 그만큼 늘어남에 따라 한 파일에 모든 소스코드를 작성할 수 없게 됐어요 100000줄이나 넘는걸 어떻게 한 파일에서 관리하겠어요 

 

그래서 파일들을 분리해서 관리하죠.

링커라는 프로그램은

1. 이런 여러 소스코드 파일들을 하나로 합쳐요 즉 Object 파일들을 하나로 합칩니다.

2. 여기에 Library를 합쳐요 

라는 작업을 해서 실행파일을 만들어줘요 

출처: http://yimoyimo.tk/Linker-and-Loader/

1번째 과정이예요 여러 오브젝트 파일에 있는 동일한 섹션들을 하나의 덩어리로 합칩니다.

 

두 번째 링커가 하는 일은 라이브러리를 합치는 일이랬죠?

 

소스파일 그림에 cout는 cout이라는 클래스 라이브러리를 쓰기 때문에 사용할 수 있는거잖아요 #Include <iostream>이런거~

그 .exe파일 만들기 위해서 오브젝트 파일들 하나로 다 링크하고 이 exe파일에다가 라이브러리를 집어넣어서 실행파일을 완성하는 작업이 linking입니다 정확히는 static linking이예요 

 

Static linking이 있다면 Dynamic linking 이 있다는 말ㅎ

정적 링킹과 동적 링킹의 정의와 차이점에 대해서는 다음 포스팅에서 얘기할게요

 

반응형