应用程序加载

应用程序加载原理
库:可执行的二进制文件,加载到内存
文件类型:
静态库 .a
动态库 .so .dll
两者是链接的区别

编译过程

我们可以直接打开工程目录Products下的.app文件找到可执行文件拖到终端可以直接运行

加载过程

库- 映射到内存 images

//输出
+[ViewController load]
(lldb) image list
[  0] 404C4B96-E4D1-3501-BBDA-B6895DA2626A 0x000000010080c000
[  1] 1AC76561-4F9A-34B1-BA7C-4516CACEAED7 0x0000000101122000 /usr/lib/dyld 
[  2] 2A92FC99-72A9-38ED-8DDD-AF4C25080124 0x0000000100820000 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/dyld_sim 
[  3] C2A18288-4AA2-3189-A1C6-5963E370DE4C 0x00007fff2071f000 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework/Foundation 
复制代码

接下来看dyld 动态链接器

ViewController.m

bt

dyldbootstrap jump 查找start

//重点看返回
return dyld::_main((macho_header*)appsMachHeader, appsSlide, argc, argv, envp, apple, startGlue);
复制代码

_main jump

getHostInfo jump

//instantiateFromLoadedImage   镜像文件加载器
CRSetCrashLogMessage(sLoadingCrashMessage);
		// instantiate ImageLoader for main executable
		sMainExecutable = instantiateFromLoadedImage(mainExecutableMH, mainExecutableSlide, sExecPath);
		gLinkContext.mainExecutable = sMainExecutable;
		gLinkContext.mainExecutableCodeSigned = hasCodeSignatureLoadCommand(mainExecutableMH);
复制代码

instantiateFromLoadedImage jump

addImage jump

instantiateMainExecutable jump

未完待续……

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享