Get Up & Code, MacKin Talk

DYLD, Dynamic Link Editor이 무엇일까? 본문

IOS

DYLD, Dynamic Link Editor이 무엇일까?

맥킨 2023. 10. 16. 22:01

개발하는 과정에서 대부분 혼자만의 코드로만 프로젝트를 구성하지 않습니다.

Github 등 오픈소스나 유료 소스를 바탕으로 특정 기능에 대한 구현을 빌리는 경우가 많습니다. 다수에 의해 검증된 코드들이 많다보니 직접 코드를 구성하는 것보다 성능이 좋은 경우도 많습니다. 

 

이렇듯 외부에 의존성을 두게 되면 일반적으로는 코코아팟 cocoapod, 카르타고, spm 의존성 관리도구를 활용하게 됩니다.

 

일반적으로는 외부 소스나 프레임워크의 사용에 에러나 큰 문제가 없겠지만,

해당 프레임워크가 dynamic framework로 제공되는 경우, 하단과 같은 에러를 만나기도 합니다.

 

dyld: Library not loaded

dyld: Library not loaded: 

뭐. 말 그대로 라이브러리가 로드되지 않았다는 뜻이겠죠.

해당 키워드의 원인은 여러 가지가 있을 수 있고, 관련된 내용을 이번 포스트에선 다루지 않겠습니다. 
(당장 문제에 대한 해결이 필요하시다면, dynamic framework와 관련된 키워드로 구글에 검색하시면 이슈 및 해결 방법을 쉽게 확인해보실 수 있습니다.)

 

이번 포스트에서는 상단 에러 메시지 앞에 붙어 있는 dyld가 무엇인지 알아보겠습니다.

 

dyld "Dynamic Link Editor" 축약어입니다. ( 왜 d,y,l,d 가 규칙성 없게 뽑아져나온지는 저도 모릅니다.)

macOS iOS 운영체제 구성요소이고, dynamic frameworks, libraries 런타임에 로드하고, 링크하는 역할 합니다.

 

dyld 앱의 entrypoint입니다.

앱이 실행되기 dyld 필수 라이브러리들을 메모리에 로드합니다.
dyld는 @rpath 불리는 앱의 특정 어트리뷰트로부터 찾아야할 라이브러리들을 알고 있습니다.

 

@rpath runtime search path 나타냅니다.

빌드 과정에 값이 설정되는데, Xcode `LD_RUNPATH_SEARCH_PATH` 설정을 하거나  `ld` 링커  `-rpath`  파라미터를 사용합니다.

 

 필드는  가지 값들로 설정이 가능합니다.   가장 많이 사용하는 값은 `@executable_path/Frameworks` 입니다. 

 

앱 바이너리 파일로부터 RunPath 얻기 위해서는 otool 명령어를 사용해   있습니다.

터미널창에  를 입력하면 LC_RPATH를 확인할 수 있습니다.

otool -l (TargetName).app/(TargetName)
ex)
otool -l Luyan.app/Luyan

 

 

어떤 앱이 실행되기 모든 dynamic frameworks/libraries 메모리에 올라가야 합니다.

 

 

하단 예시는 emergetools 에서 작성한 글에서 인용한 그림입니다.

main() 함수가 실행되기 이전에 dyld 의한 선행 작업이 진행되는 것을 확인할 있습니다. 

그림에서 <early startup> dynamic frameworks libraries 메모리에 로드되는 시간을 나타내고 있습니다.

당연한 말이겠지만, 많은 dynamic framework library 로드할수록 <early startup> 소요 시간은 길어집니다. 

 

 

동적 라이브러리나 프레임워크를 사용하면 번들의 크기가 줄어듭니다. 정적 라이브러리나 프레임워크처럼 직접 앱 번들 내부에 포함되지 않기 때문에 당연한 결과입니다.

다만, 정적 프레임워크를 사용할 비교해 앱 실행 회귀가 발생할 있다고 합니다.

 

 

보다 자세한 내용은 하단 기재한 페이지 및 wwdc22 Link fast: Improve build and launch times 세션 들어보시기 바랍니다.

 

 

ref

--------------------------------------------------------------------------------

wwdc2022 https://developer.apple.com/videos/play/wwdc2022/110362/

https://rassadin.net/swift-frameworks-unreal/

https://www.emergetools.com/glossary/dyld