学习应用启动优化的一些烂笔头总结!!

1,577 阅读3分钟

序言

生命不止,学习不停。保持终身学习的习惯,共勉!!!最近一直在跟着一位老师在学习iOS方面的知识,整理了一些笔记,毕竟好记性不如烂笔头,,希望能对你们有所帮助。主要是关于应用启动优化,一些编译命令和二进制重排方面的。

编译命令

1.生成目标文件

目标文件包含了机器指令代码、数据,链接时需要的信息,符号表、调试信息,字符串表。

1.不指定target,默认Mach-0 64-bit object x86_64:

image.png

clang-o是将.c源文件编译成为一个可执行的二进制代码(-o选项其实是制定输出文件文件名,如果不加-c选项,clang默认会编译链接生成可执行文件,文件的名称由-o选项指定)。

clang-c是使用LLVM汇编器将源文件转化为目标代码。这时,只

  1. 指定生成Mach-0 64-bit x86_64目标文件格式:

image.png

3.如果指定target不带apple系统版本(包括macOS,ipadOS,iOS,真机和模拟器)。例如x86_64,那么生成的目标文件是Linux的ELF 64bit:

image.png

4.编译.m:

image.png

5.编译.mm:

image.png

2.查看调试信息

dwarfdump取出并验证DWARF格式调试信息:

image.png

3.查看文件内容

objdump用来查看文件内部结构,包括ELF和Maach-o:

image.png

4.静态库的压缩和解压缩

ar压缩目标文件,并对其进行编号和索引,形成静态库。同时也可以解压缩静态库,查看有哪些目标文件:

image.png

image.png

5.创建静态库

创建库命令:libtool。可以创建静态库和动态库:

image.png

6.创建动态库

image.png

7.查看符号表

nm命令:

image.png

symbol types:

image.png

image.png

image.png

8.生成dsYM文件

dsymutil操作DWARF格式的debug symbol。可以将可执行文件debug symbol的生成DWARF格式的文件:

image.png

9.移除符号

strip用来移除和修改符号表:

image.png

10.链接动态库与静态库

image.png

11.Xcode打印加载的库

Pre-main Time指main函数执行之间的加载时间,包括dylib动态库加载,Mach-0文件加载,Rebase/Binding,OBjective-C Runtime加载等。

Xcode自身提供了一个控制台打印这些时间的方法:在Xcode中Edit Scheme->Run->Auguments添加环境变量DYLD_PRINT_STATISTICS并把其值设为1.

DYLD_PRINT_LIBRARIES:打印出所有被加载的库。

DYLD_PRINT_LIBRARIES_POST_LAUNCH:打印的是通过dlopen调用返回的库,包括动态库的依赖库,主要发生在main函数运行之后。

二进制重排

1.链接order。file

image.png

2.生成Link Map

image.png

到这里了,我就把最近学得一堂课分享完了,把这些内容写到这里,对这方面的知识感觉掌握的更加牢固和顺畅了,就像拼图一样,好多碎片化的知识点都在脑海中形成了一个面,如果你也需要一些iOS方面的资料的话,请点击下方获取,我会无偿分享给大家的

资料分享:下载地址