序言
生命不止,学习不停。保持终身学习的习惯,共勉!!!最近一直在跟着一位老师在学习iOS方面的知识,整理了一些笔记,毕竟好记性不如烂笔头,,希望能对你们有所帮助。主要是关于应用启动优化,一些编译命令和二进制重排方面的。
编译命令
1.生成目标文件
目标文件包含了机器指令代码、数据,链接时需要的信息,符号表、调试信息,字符串表。
1.不指定target,默认Mach-0 64-bit object x86_64:
image.pngclang-o是将.c源文件编译成为一个可执行的二进制代码(-o选项其实是制定输出文件文件名,如果不加-c选项,clang默认会编译链接生成可执行文件,文件的名称由-o选项指定)。
clang-c是使用LLVM汇编器将源文件转化为目标代码。这时,只
- 指定生成Mach-0 64-bit x86_64目标文件格式:
[图片上传失败...(image-213fff-1635232213848)]
3.如果指定target不带apple系统版本(包括macOS,ipadOS,iOS,真机和模拟器)。例如x86_64,那么生成的目标文件是Linux的ELF 64bit:
[图片上传失败...(image-64847b-1635232213848)]
4.编译.m:
[图片上传失败...(image-b49615-1635232213848)]
5.编译.mm:
[图片上传失败...(image-9341f8-1635232213848)]
2.查看调试信息
dwarfdump取出并验证DWARF格式调试信息:
[图片上传失败...(image-34dd26-1635232213848)]
3.查看文件内容
objdump用来查看文件内部结构,包括ELF和Maach-o:
[图片上传失败...(image-29cfd7-1635232213848)]
4.静态库的压缩和解压缩
ar压缩目标文件,并对其进行编号和索引,形成静态库。同时也可以解压缩静态库,查看有哪些目标文件:
[图片上传失败...(image-feb329-1635232213848)]
[图片上传失败...(image-a6aa2a-1635232213848)]
5.创建静态库
创建库命令:libtool。可以创建静态库和动态库:
[图片上传失败...(image-af1843-1635232213848)]
6.创建动态库
[图片上传失败...(image-882b49-1635232213848)]
7.查看符号表
nm命令:
[图片上传失败...(image-c3586d-1635232213848)]
symbol types:
[图片上传失败...(image-51e28c-1635232213848)]
[图片上传失败...(image-645ded-1635232213848)]
[图片上传失败...(image-bbefc9-1635232213848)]
8.生成dsYM文件
dsymutil操作DWARF格式的debug symbol。可以将可执行文件debug symbol的生成DWARF格式的文件:
[图片上传失败...(image-b6eb84-1635232213848)]
9.移除符号
strip用来移除和修改符号表:
[图片上传失败...(image-2a2ede-1635232213848)]
10.链接动态库与静态库
[图片上传失败...(image-e351a8-1635232213848)]
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-bb203-1635232213848)]
2.生成Link Map
[图片上传失败...(image-be5330-1635232213848)]
到这里了,我就把最近学得分享完了,把这些内容写到这里,对这方面的知识感觉掌握的更加牢固和顺畅了,就像拼图一样,好多碎片化的知识点都在脑海中形成了一个面,如果你也需要一些iOS方面的资料的话,请关注主页!!!
网友评论