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

[컴퓨터 구조] LLVM, clang, static/dynamic linking

by lody.park 2024. 5. 12.

안녕하세요 로디입니다.

 

학부 때는 gcc 를 바탕으로 프로그램 소스 컴파일과 실행과정에 대해 배웠습니다.

 

저는 학부때 처음 개발 걸음마를 떼고 1년 정도를 IDE 없이 순수 에디터로만 c++ 를 개발했었습니다.

그래서 소스를 작성하고, 직접 컴파일과 어셈블, 링킹, 그리고 로딩 과정으로 프로그램을 실행했었죠.

 

지금보면 참 낭만코딩,,, 이였던것 같습니다.

이런 과정을 자동화하기 위해 Makefile도 다루고 했었는데 말이죠..

이젠 IDE나 유틸리티에 익숙해지다보니 머릿속에서 증발했네요 🥲

 

Translation and StartUp 프로세스

c++, object-c, swift와 같은 고수준 프로그래밍 언어에서 프로그래밍 소스를 기계어 레벨로 번역하고 컴퓨터에서 실행가능한 프로그램을 만드는 메커니즘은 다 비슷할겁니다. 통상적으로 아래 단계를 거쳐 프로그램은 실행되는데요, 때에 따라 단계가 통합될 수 있죠.

 

- 소스 작성 

- 컴파일 (컴파일러)

- 어셈블 (어셈블러)

- 링킹 (링커)

- 로딩 (로더)

 

우리는 Xcode를 통해 앱 개발을 합니다.

 

Apple의 개발 툴인 Xcode는 macOS 및 iOS 애플리케이션을 개발하기 위한 통합 개발 환경(IDE)입니다

 

Xcode를 통해 개발할때는 버튼만 누르면 간편하게 빌드와 실행을 할 수 있습니다.

 

그러면 Xcode에서는 어떻게 프로젝트 소스 파일을 실행할 수 있는걸까요? 어떠한 과정을 거쳐 이뤄지는걸까요?

 

LLVM은 Xcode만 소유한 컴파일러는 아닙니다. 오픈소스죠. 다만 소스 공개 의무가 없는 오픈소스 입니다.

(gcc는 소스 공개 의무가 있는 오픈소스입니다. apple이 LLVM 프로젝트를 주도적으로 지원한 이유이기도 합니다)

 

Xcode는 Clang과 LLVM 외에도 Interface Builder, 앱 번들링 도구, 프로비저닝 프로필 관리 등도 포함합니다.

* LLVM
LLVM은 다양한 프로그래밍 언어의 컴파일을 지원하는 컴파일러 백엔드로, Clang 컴파일러 프론트엔드를 포함합니다. Clang은 C, C++, Objective-C, 그리고 Swift와 같은 언어의 소스 코드를 LLVM 중간 표현(IR)으로 변환하는 데 사용됩니다.

 

Xcode는 LLVM (Low Level Virtual Machine) 기반의 컴파일러를 내장하고 있습니다.

 

Swift와 Object-C로 작성된 소스 코드는 컴파일 과정에서 LLVM 컴파일러를 사용하여  LLVM 중간 표현(IR)으로 코드를 변환합니다.

이 중간 언어는 플랫폼 독립적인 최적화를 거친 후 타겟 아키텍처(예: x86_64 또는 ARM)에 맞게 기계어로 변환되는데, 이때 어셈블러가 사용될 수 있습니다.

 

컴파일된 기계어 코드는 필요한 라이브러리와 함께 링크되어 실행 가능한 파일을 생성합니다. 이 과정에서 다양한 프레임워크 및 시스템 라이브러리가 연결될 수 있습니다. Objective-C의 경우, 종종 Cocoa 프레임워크와 같은 Objective-C 라이브러리들이 링킹됩니다.

 

생성된 실행 파일은 OS X의 로더에 의해 메모리로 로딩되며, 프로세서(CPU)에서 실행됩니다. 

 

링킹 과정에 대해 좀 더 자세하게 보겠습니다.

 

static vs dynamic linking / library

우리가 소스코드를 작성하고 컴파일하면 각 소스파일마다 Object모듈이 하나씩 만들어집니다.

링커는 컴파일의 산출물인 Object모듈들과 외부 라이브러리 Object 모듈들을 링킹하여 실행가능한 프로그램으로 만들어냅니다.

 

링킹에는 2가지 방식이 있습니다. 바로 static과 dynamic입니다.

차례대로 살펴보겠습니다. 

 

static linking은

의존성이 있는 라이브러리 소스파일의 오브젝트 코드도 링크해 excutable file 안에 포함시킵니다.

다양한 라이브러리에 대한 의존성이 커질수록 excutable file의 사이즈는 커지게 됩니다.

 

반면 dynamic linking은

의존성이 있는 라이브러리 소스파일의 오브젝트 코드를 excutable file에 포함시키지 않습니다.

 

 

다양한 그림들이 있어서 긁어왔습니다. 

 

 

 

 

 

참고:

https://0xd00d00.github.io/2022/05/29/gcc_clang.html

 

[컴파일러] 컴파일러 동작과정과 종류 (Feat. GCC & Clang) - 널두

항상 겸손함은 처음처럼 (Null do) 실력은 너드처럼 (Nerd do) 🔥

0xd00d00.github.io

https://velog.io/@msi753/LLVM-%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EC%BB%B4%ED%8C%8C%EC%9D%BC

 

#1-1. LLVM은 무엇이며 스위프트 코드는 어떻게 실행하는 것인가 [Swift]

스위프트의 컴파일 및 빌드과정을 알아보자

velog.io

https://velog.io/@dvhuni/Swift-Compiler-1

 

Swift Compiler #1

안녕하세요!! 이번에는 Compiler를 가지고 이야기를 해보겠습니다 !! 🎉

velog.io

https://zeddios.tistory.com/1308

 

(Static/Dynamic) Library

안녕하세요 :) Zedd입니다. ~ 애플 문서를 보던 중 ~ Overview of Dynamic Libraries Overview of Dynamic Libraries Two important factors that determine the performance of apps are their launch times and their memory footprints. Reducing the size

zeddios.tistory.com

https://heartbeat.comet.ml/xcode-build-settings-in-depth-733667d01a9a

 

Xcode Build Settings in Depth

Getting to the rock bottom of Xcode build settings.

heartbeat.comet.ml

https://academy.realm.io/posts/tryswift-jesse-squires-contributing-open-source-swift/

 

Contributing to Open Source Swift

Do you want to contribute to Swift? Not sure how or where to begin? It can be overwhelming! In this talk from the inaugural try! Swift conference, Jesse will help you explore the different parts of Swift, see how the various Swift projects are related, dis

academy.realm.io

https://eunjin3786.tistory.com/323

 

[iOS] XCode Build System 이해하기

Understanding Xcode Build System 이라는 포스팅을 읽었는데 대학생때 배웠던 Compile Process (전처리기 -> 컴파일러 -> 어셈블러 -> 링커) 에 여기저기서 주워들은(?) llbuild, SIL, clang 등 Xcode Build 관련 용어들이

eunjin3786.tistory.com

https://zeddios.tistory.com/919

 

Behind the Scenes of the Xcode Build Process (1)

안녕하세요 :) Zedd입니다. 티스토리 앱이 완전히 리뉴얼 됐네요!! https://apps.apple.com/kr/app/%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC-tistory/id906304982 ‎티스토리 - TISTORY ‎티스토리 블로거만을 위한 모바일 앱! 티

zeddios.tistory.com