본문 바로가기
컴퓨터/컴퓨터구조

[UCB CS61C] Lec13 Compiling, Assembling, Linking, Loading

by 봄여름가을 2024. 1. 12.

Compiler

  • high-level language code를 입력으로 받아서, assembly language code를 출력함.
  • compiler가 출력한 내용에는 pseudo instruction이 포함될 수도 있음(assembler는 이해하지만 machine은 이해할 수 없음)

Assembler

  • assembly language code를 입력으로 받아서, object code, information table을 출력함.
  • pseudo instruction을 대체하고 machine language로 바꾸게 됨.
Producing Machine Language
  • arithmetic, logical, shift 등은 이미 필요한 정보가 instruction 내에 모두 포함되어 있음. branch, jump는 PC-relative address를 기준으로 파악 가능함.
  • 그런데 label이 아직 확인되지 않은 앞의 것인 경우에는 코드에서 그 label로 branch하라고 했을 때 알 수가 없음. 따라서 two passes를 돌면서, 첫 패스에서는 label의 위치를 기억하고, 두번째 pass에서 이 위치를 이용하여 코드를 만듦.
  • jump, branch의 PC-relative address를 위해서는 offset을 half-word 단위로 계산해서 position-independent code를 만들어 주면 됨.
  • 그런데 static data로 접근하기 위해서는 최종적인 32-bit address가 필요하고, 이는 당장 결정될 수 없음.
    • 이러한 문제를 해결하기 위해 symbol table(label, data 영역에 대한 정보를 포함), relocation table(최종적으로 absolute address를 결정해야 하는 항목들. 이는 이후에 linker를 통해 최종 주소를 결정한다)
Object File
  • file header, text segment(machine code), data segment(static data), relocation information(need to be fixed up later), symbol table(labels and static data the can be referenced), debugging information

Linker

  • object code files, information tables를 입력으로 받아서 executable code로 만듦.
  • 여러 object file들을 하나의 executable로 만들어 주기 때문에 linker라고 불림.
  • 모든 text segment를 가져와서 모아주고, 모든 data segment를 가져와서 모아주고, reference 문제를 해결(absolute address로 채워줌)함.
Resolving References
  • PC-relative addressing은 relocate할 필요가 없으나, absolute function address, external function reference, static data reference는 모두 relocate해 주어야 한다.
  • linker는 first word of first text segment가 0x10000위치에 있다고 가정한다. 각 text, data segment의 길이와 순서를 알고 있으므로 absolute address를 계산할 수 있다.
  • data 또는 label reference에 대해 symbol table을 먼저 찾아보고, 없으면 library file을 찾아본다.
Dynamically-Linked Libraries
  • 상기한 방식은 statically-linked approach로서 library도 executable의 일부로 포함됨. 만약 library를 업데이트하면 다시 컴파일해야만 이를 포함시킬 수 있다.
  • 그래서 runtime에 library를 링크하는 DLL이 사용되고 있다.
    • 디스크 용량과 메모리를 줄일 수 있고, 업그레이드가 라이브러리 파일의 교체만으로 이루어지므로 간단하다. 하지만 런타임에 time overhead가 발생하고, executable만으로는 실행할 수 없게 된다.
    • 현재 사용하는 DLL 방식은 machine code level에서 link하고 있다.

Loader

  • executable code를 입력으로 받아서 프로그램을 실행함. 현실에서 loader는 바로 OS다.
  • loader는 executable file의 헤더를 읽어서 사이즈를 파악하고, 이를 담을 수 있는 새로운 address space를 만든다. 이 address space로 instruction, data를 복사하고, argument를 stack으로 복사한다. 그리고 machine register를 초기화한 뒤 start-up routine으로 간다. 여기서는 PC를 지정하고, argument를 stack에서 register로 복사해준다.

댓글