티스토리 뷰

Linking

Linking : 여러 개의 코드데이터를 통합·연결하여 실행될 수 있는 하나의 파일로 만드는 작업

 

[ Linking의 종류 ]

  Static Linking

    : Compile-Time에 수행되는 Linking.
    : 라이브러리를 같이 포함시켜 실행 파일을 만드는 방법.

       (소스 코드와 라이브러리를 merge한다고 표현)

    : 파일 수정 시 전체 파일을 모두 다시 Compile해야 하는 문제.

    : Redundancy 발생 가능.

    : -static 옵션으로 수행 가능.

 

  Dynamic Linking

    : Run-Time 또는 Load-Time에 수행되는 Linking.

    : Dynamic Linker가 호출될 때 Share 과정을 거침.

    : 메모리 상으로 효과적.

    : 수행 시간 중에 Linking이 진행되므로, Runtime Overhead가 발생할 수 있음.

    : 오류 생성 시 해당 오류가 발생한 라이브러리만 수정. (분할 작업 가능 → 생산성 향상)

    : 필요한 기능을 지닌 라이브러리를 재활용 가능.

    : -shared 옵션으로 수행 가능

 

[ Object File의 종류와 ELF ]

  Relocatable File(.o file) : 실행 불가능한 파일. 불완전한 파일. 

  Executable File(.out / .exe file) : 실행 가능한 파일. 완전한 파일.

  Shared File(.so / .dll file) : Dynamic Linking을 지원하기 위한 파일.

 

  ELF File(Executable and Linkable Format)

    : 리눅스에서 사용되는 위 3가지 파일의 Format을 말한다.
    : 정형화된 File Format 구조를 가진다. (ELF 자료형)

ELF Structure

[ Linker의 작업 수행 과정 ]

 Linker : 컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 이를 단일 실행 프로그램으로 병합하는 프로그램.

  1. Symbol Resolution

    : 각각의 Symbol을 하나의 Symbol로 연결. → 같은 이름을 가진 Symbol을 Rule에 따라 관계 정의.

  2. Relocation

    : 파일을 Merge하면서 각각의 코드에 있는 주소를 하나의 파일에 맞게 수정해주는 작업.

       (배치가 완료되므로 각각의 주소가 모두 결정되는 과정.)

    : Section과 Symbol의 정의를 Relocate.

    : Merge, Relocation, Update, Reference 과정 진행.

    : ELF의 .text section에 코드, .data section에 초기화된 전역 변수가 들어간다.

Linker의 작업 수행 과정

 

[ Symbol과 Symbol Table ]

  Symbol

    : 함수 및 전역 데이터에 대한 정보를 포함하는 언어적 독립체.

 

  Symbol Table

    : 각 object file에 존재하는 Symbol의 정보를 저장한 테이블. (.symtab)

    : Value, Bind, Type, Section, Size 정보를 가지고 있다.

    : Linking 또는 Debuging 때만 필요하므로, 실행 파일로 넘어가면 사라진다.

Object File and Symbol Table

    Value :  Symbol의 offset(시작 주소).

    Bind : Symbol의 Bind 종류.

      · 전역 심볼(Global Symbol) : non-static Symbol. 전역 변수와 전역 함수를 뜻한다.

      · 지역 심볼(Local Symbol) : static Symbol. 정적 변수와 정적 함수를 뜻한다. (지역 변수가 아님)

      · 외부 심볼(External Symbol)

        : Undefined Symbol. 참조 심볼. 다른 파일에서 정의된 심볼을 참조하는 심볼.

        : *UND*로 표시되며, 이를 pseudosection이라 한다.

    Type : Function과 Object로 구분.

    Section : ELF의 Section 부분을 말한다. 

      메모리 로드 영역

        · .text : 소스 코드.

        · .rodata : 읽기 전용 데이터. (Jump table 등)

        · .data : 초기화 된 전역 또는 정적 변수.

        · .bss

          : 초기화 되지 않은 전역 또는 정적 변수.

          : 실행될 때 공간을 아끼기 위함.

          : 초기화가 0으로 된 경우도 이 section으로 오게 된다.

      메모리 비-로드 영역

        · .symtab : 심볼 테이블의 정보.

        · .rel.text : 실행 파일에는 없는 section. 구멍 난 text가 들어가며, Linker가 다른 오브젝트 파일과 연결할 때 이용.

        · .rel.data : 실행 파일에는 없는 section. 구멍 난 심볼(extern 변수, extern 함수)의 정보가 들어있다. Linking시 이용.

        · .debug : 디버그 심볼 테이블의 정보.

        · Section header table : 파일의 section들에 관한 정보가 입력 된 테이블.

        · Pseudosection : Section header table에 엔트리가 없는 섹션.
          - *ABS* : 재배치가 이뤄지면 안 되는 심볼을 위한 Section. Absolute.

          - *UND* : External Symbol을 위한 Section. Undefined.

          - *COM* : 초기화되지 않는 전역 변수들을 위한 Section. Common.

    Size : Symbol의 크기.

 

[ Linker's Symbol Rules ]

  Strong Symbol : 초기화 된 Global Symbol

  Weak Symbol : 초기화되지 않은 Global Symbol

   ( 0으로 초기화 된 경우는 .bss section으로 들어가지만 Strong Symbol로 본다 )

 

  Symbol Rules : Linking 시 동일한 Global Symbol이 존재 할 때 상관관계를 정해주는 규칙.
    1. Strong Vs. Strong : Linking Error 발생

    2. Strong Vs. Weak : Weak Symbol을 extern으로 지정.

    3. Weak Vs. Weak

      : 둘 중에 하나를 extern으로 지정. (어떤 것이 될 지는 알 수 없음)

      : 두 변수의 자료형의 크기가 다를 경우 다른 변수의 주소에 침범해 데이터를 손실시킬 위험이 있음.

Symbol Rules의 예시

 

[ Library의 종류 ]

  Static Library

    : 프로그램을 컴파일하는 과정에서 포함시키는 오브젝트 파일의 모임.

    : archive(ar command) 형태로 패키징. (.a file)

      (archive : 여러 개의 파일을 묶어서 보관하는 기록 보관소. 용량 절감 효과.)

      (윈도우 환경에서는 .lib file 형태이다. 하지만 .lib이 모두 정적 라이브러리는 아니다.)

    : libc.a, libm.a 등이 이에 속한다.

    : 이식성이 좋고 안정적이라는 장점이 있지만, Static Linking의 문제점이 그대로 적용된다.

    : 정적 라이브러리를 Linking할 때, Command Line Order 문제를 해결하기 위해 라이브러리를 마지막에 써준다.

 

  Shared Library

    : 완성된 프로그램을 실행할 때 포함시키는 동적 라이브러리.

    : Version Control 문제나 Server 문제를 쉽게 해결할 수 있음. → Restart, Recompile 방지.

 

[ Library Interpositioning ]

  Interpositioning

    : 원본의 파일 수정 없이 임의의 함수 호출 시 함수를 가로채 원하는 함수가 호출되도록 하는 방법.

    : Compile-Time, Link-Time, Load/Run-Time에 수행 가능.

    : 보안, 디버깅, 모니터링, 프로파일링에 사용 가능. Malloc Tracing이 대표적. → 메모리 누수 탐색, 할당 주소 추적

 

    1. Compile-Time

      : 소스 코드 컴파일 시 -I 옵션을 통해 헤더 파일 주소를 변경.

    2. Link-Time

      : -Wl,--wrap,malloc 옵션을 통해 참조를 변경. Static Linking 시에 가능.

    3. Load/Run-Time

      : Dynamic Linker의 LD_PRELOAD 환경 변수를 변경하여 가능.

      : LD_PRELOAD="./mymalloc.so"; ./intr

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함