#什么是.o文件
- .o文件就是对象文件,是可重定向文件的一种,通常以ELF格式保存,里面包含了对各个函数的入口标记,描述,当程序要执行时还需要链接(link).链接就是把多个.o文件链成一个可执行文件。
- 当多种编程语言希望混合编译时,就可以通过分别编译成.o文件,再链接(link)成可执行文件。
- .a或者.dylib都将成会被编译器 编译成为编译单元(.o), 每个.o里面有确定的符号和不确定的符号, 所有不确定的符号都在链接过程中互相填补。.a 和 dylib 没有啥本质区别,都是一堆 .o 的集合
#什么是dylib
####dylib浅析
- dynamic library 动态函数库,简称dylib
- 优势:文件体积会更小,升级会更方便,改动代码的话可以省去重新编译的时间
#什么是Mach-O
- Mach object文件格式的缩写,是一种可执行文件、目标代码、共享程序库、动态加载代码和核心DUMP。是a.out格式的一种替代。Mach-O提供更多的可扩展性和更快的符号表信息存取。
- App里面的所有代码,资源,可执行文件都会在程序编译的时候打包进Mach-O文件里面.
- Mach-O一般分为几段: mach_header、load_commands、segment
#如何查看当前App引用了那些dylib与framework?
- 查看Mach-O(可执行二进制文件)引用的framework与dylib可以通过两种方式来看.
1. 命令行: otool -L yourApp.app/yourApp
2. 用MachOView视图工具, File->Open->YourApp.app/yourApp
#动态库的加载顺序
1. 首先会加载系统级别的dylib, 目录在设备的`/usr/lib/`, 文件:`libsqlite3.dylib、libc++.1.dylib...`
2. 然后加载系统级别的framework, 目录在设备的`/System/Library/Frameworks`, 文件:`Foundation.framework`
3. 再引入runtime、gcd存放的dylib, 目录在设备的`/usr/lib/`, 文件:`libSystem.B.dylib、libobjc.A.dylib`
3. 再引入自己注入的dylib, `@executable_path/`(目录存放在当前可执行文件底下)
所以逆向的人能hook系统的API也是因为系统的framework先加载.