Computer Architecture 4 Linking

Blue·2022년 12월 4일
0

컴퓨터구조

목록 보기
9/11

Linking

Linking 이란 간단히 말하면 하나의 "실행가능"한 파일로 만드는 것이다.

기계어는 Binary Data(0,1 로 이루어짐) 이고 Assembly는 기계어와 유사하게 되어있는 Text 라 한다.

이 예시를 보자.

왼쪽의 코드를 A 가 짠 Main.c 이고 오른쪽 코드를 B 가 짠 Swap.c 라 한다. 그럼 A,B 각각의 Source 를 컴파일 해서 Object file 로 만들고 Linker 로 합쳐서 실행가능한 파일로 만드는 것이다.

Main.c 의 파일은 Assembly Line 으로 되어있다. 그런 Assembly 언어를 전처리기를 통해서 Compile 하게 되면 Main.o 라는 Object file 이 되고 이것을 Relocatable Object file 이라 한다. Relocateble 이라는 것은 뒤에서 조금더 세세하게 배우도록 한다.

하여튼 이러한 Object file 들이 모여 Linker 라는 프로그램에 의해 Fully Linked Executable Object File 로 변환되게 된다.

Compiler vs Interpreter

컴파일러와 인터프리터의 차이점이다.

Translate Unit

컴파일러는 전체 코드를 실행가능한 기계어로 바꾸는 반면에 인터프리터는 한줄씩 작동시켜서 한줄씩 번역(Translate) 하게 된다.

Performance

그래서 컴파일러는 전체의 코드를 분석하는데 시간이 오래걸리게 되지만 전체적 실행시간은 비교적으로 빠르다한다.
그러나 인터프리터는 한줄씩 작동하기에 분석시간이 짧지만 전체적인 실행 시간은 느리다.
여기서 컴파일러는 전체의 코드를 작동하고 인터프리터는 한줄씩 작동하는데 왜 실행시간은 컴파일러가 더 빠른가? 에 대한 의문이 생겼다.
아닐수도 있지만 나만의 생각은 컴파일러는 전체의 코드에 대한 한번의 실행시간을 가지면 되는 반면에 인터프리터는 한줄씩 계속 실행을 시켜줘야하는것에 있어서 상대적으로 느리고 빠르다 . 라고 쓴거같다.

Debugging

컴파일러는 전체적인 프로그램을 스캔한 후에만 error message 를 발생시킨다. 그래서 디버깅은 상대적으로 어렵다.
-> 프로그램 어디서든 오류가 나올수 있기 때문이라 한다.

인터프리터는 에러를 마주칠떄까지 프로그램을 번역시키기에 디버깅은 쉽게된다.

Memory Allocation

컴파일러는 object codes 를 발생시키는데 많은 메모리가 필요하게 된다.

인터프리터는 object code 를 발생시키지 않기에 컴파일러에 비해 적은 memory 가 필요하게 된다.

Object file

컴파일러는 object file을 생성하고, 인터프리터는 그렇지 않다.

Example

컴파일러는 C,C++,JAVA에서 사용되고 인터프리터는 Python,Ruby,Html 에서 주로 사용된다 한다.

What is Linking?

위에서 말했던것 처럼 Linking 은 서로다 른 개별 object file 을 모아서 하나의 실행가능한 File 로 만드는것이다.

Linker 에는 Relocatable 한 개별 Object file 이 들어와서 Linker 를 통해 Executable object file 로 만들어지게 된다.

Linking 은 컴파일될떄 즉 Source Code 가 번역되어졌을때 Linking 될수 있다.
-> 이것을 Static Linker 라 한다.

그리고 Linking 은 Load Time 즉 프로그래밍 메모리에 로드되는 시간에 Linking 될수도 있고, Runtime 에 linking 될수도 있다
-> 이것을 Dynamic Linking 이라한다.

Static Linking

Static Linker 란 Compile Time 즉 Source code 가 번역되었을때 수행되어지는 것이다.

relocatable object file 들 그리고 Command Line arguments 들을 묶고 executable object file 로 만든다.

Why Linkiers?

Modularity

모듈성이라 불리는데 Source 코드는 혼자를 짜던 많은 사람이 짜던 그것들의 collection 으로 프로그램이 쓰여진다.

그래서 공통 함수의 library들을 build 할수있다.

Efficiency

Efficiency를 말할땐 Time과 Spcae Efficiency 를 보게 된다.

일단 하나의 source file 만 바꾸면 되고, 컴파일하고 다시 link 하면된다.
그리고 다른 source file들을 recompile 할 필요도 없다.
그리고 다중의 파일들을 동시적으로 컴파일 할수도 있다.
그래서 time 적으로 efficiency 하다.

공통적인 함수들은 하나의 파일로 합쳐지게 된다.
그래서 실제로 사용되어지는 함수만 코드에 포함하면 된다.
그래서 space 적으로도 efficiency 하다.

What Do Linkers Do?

Linker 가 하는 두가지 main task 가 있다.

Symbol resolution

Symbol 이란 함수의 이름이나 변수의 이름이라 하는데 이러한 Symbol 들을 구분하는 것이다.

Symbol definition 들은 symbol table 에 저장되어진다.
그리고 Linker 는 각 symbol reference 를 하나의 symbol definition 과 연관짓는다.

Relocation

Relocation 이란 각각의 code를 하나의 section 으로 모으는 것이다.
그래서 밑의 그림처럼 Code 는 Code 끼리 Data는 Data 끼리 모으는 것이다.

Bss 는 선언만하고 초기화 되지 않은 Data 의 값을 넣게 된다.

Three Kinds of Object Files

Relocatable object file 은 Compile 의 Output이다.
Executable object file 은 Linker의 Ouput 이다
Shared object file 은 Dynamic Linking 이라 한다.

Executable and Linkable Format(ELF)

Object file format 은 System 마다 다르다.
a.out 이라고 하는 unix 시스템에서 쓰던 파일은 ELF 가 되었고

COFF 라고 하는 system 5의 초기버전에서 사용되던 파일은 PE 가 되어 Window 에서 사용되고 있다.

ELF 는 executable and Linkable format 이다.
object file 의 표준 이진 포맷이다.

Relocatable file,executable object file, shared object file 은 ELF Format을 따른다.

옛날에 쓰던 a.out 방식과는 다르게 ELF느 Dynamic Linkin을 위한 shared libraries 에 더 적합하다.

ELF Object File Format

ELF 의 파일 구조를 나타낸 것이다.

ELF header

Linker 에게 필요한 기본 정보들을 담고있다.
word size,byte ordering....

Program header table

데이터의 모음들을 담고있다. 이러한 정보는 상대적 위치를 포함하고 있는데 relocatable file 에는 있을 필요가 없다. 어짜피 relocatable file들은 다시 옮겨지게될꺼기 떄문.

Text section

Code 영역이다.

Rodata section

data section

data 영역

bss section

Bss 는 Block started by symbol,Better Save space 라고도 불리지만 이름이 어떻든 상관은 없다.
Bss section 에는 초기화 되지 않은 것들이 들어가게 된다.

그리고 만약
A - int a[100]={0};
B - int a[100];

을 보게되면 B가 bss section 에 들어가게 될것이다.
초기화 안하면 그냥 필요하다라고 알고만 있으면 되기에 실제로 공간을 차지하진 않는다.

symtab section

Executable file 에 이러한 symbol 이 있다고 알려준다.

rel text section

relocate 될꺼다.

rel data section

main.o 에는 swap의 symbol이 이있지만 내용은 없다.
그 내용이 어디에 있는지 알려준다.

executable file 에는 rel text section,rel data section 이 필요하지 않다.

debug section

line section & strtab section

sectino header table

Life and Scope of Variables

Life vs Scope

Life 는 이 변수를 위해 할당된 메모리가 시스템 메모리에 있느냐 없느냐를 나타내고.
Scope 는 해당 변수에 접근할수있는 애가 무엇인가? 를 나타낸다.

Local Variables

지역 변수로 함수안에서 정의되는 변수이다.
함수 안에서만의 접근이 가능하고 함수가 끝나게 되면 변수도 제거가 된다.
그래서 만약 다시 함수를 호출하게 되면 그 변수를 위한 공간이 다시 할당이되고 다시 초기화가 된다.

static local variables

만약 변수가 프로그램의 life 를 넘어서 연장되고싶다면 static 을 붙인다.
프로그램 끝날때 까지 있을수 있는 공간을 마련하고(data) scope 는 functon scope 이고 Life 는 Program 끝날때까지가 된다.

다시 호출했을때 또 값을 사용하고싶을때 주로 static 을 사용한다.

Global variables

함수 바깥부분에 정의되는 변수이다.

Three Types of Linker Symbols

Symbol

함수의 이름이나 변수의 이름이다.

Global symbol

다른 모듈에 의해 referenced 되어진 module m에 의해 정의된 symbol 이다.

External symbol

global symbol 이긴함.

local symbol

lacal variable 아니다.
module m 에서 독점적으로 referenced 그리고 정의된 symbol 이다.

Strong and Weak Symbol

Strong 은 초기화된 변수이고 Weak 는 초기화 되지 않은 변수이다.
이런 Symbol 에는 규칙이있다.

  1. 두개이상의 Strong symbol 은 허용되지 않는다.
    strong 이 두개면 error가 뜬다.

  2. Strong 과 Weak 가 있으면 Strong을 선택하게 된다.

  3. 두개다 weak 이면 임의의 하나를 고른다고,,,한다,,,

profile
할수있다가 아닌 해야한다!!

0개의 댓글