Mach-O
Header
文件类型、目标架构类型等
LoadCommands
描述文件在虚拟内存中的逻辑结构、布局
Raw segment data
__TEXT
__DATA
载进虚拟内存会变大
__LINKEDIT
虚拟内存中的布局
- pagezero
arm64: 0x00 0x100000000(size)
armv7: 0x00 0x4000(size)
常见Mach-O文件类型
MH_OBJECT
目标文件(.o)
静态库文件(.a), 静态库其实就是N个.o
合并在一起
MH_EXECUTE
可执行文件
MH_DYLID
动态库
.dylib
.framework/xxx
MH_DYLINKER
动态链接编辑器
/usr/lib/dyld
dyld用于家在以下类型的Mach-O文件
- MH_EXECUTE
- MH_DYLIB
- MH_BUNDLE
MH_DSYM
存储着二进制文件符号信息的文件
.dSYM/Contents/Resources/DWARF/xxx(常用来分析APP的奔溃信息)
Universal Binary
同时适用于多种架构的二进制文件
包含了多种不同架构的独立的二进制文件
由于两种架构有共同的一些资源,所以不会达到单一架构版本的两倍之多
FreeBSG
Darwin
xnu
mac的内核
otool
1
2
3
4
5
6
# print fat headers
otool -f <mach-o>
# print header
otool -h <mach-o>
# print dylib used
otool -L <mach-o>
lipo
1
2
3
4
5
6
# 查看支持的架构
lipo -info <mach-o>
# 抽取出arm64架构的mach-o
lipo <mach-o> -thin arm64 -output <output-mach-o>
# 合并两种架构的mach-o
lipo -create <mach-o-armv7> <mach-o-arm64> -output <mach-o>
file
1
file <mach-o>
size
1
2
size --help
size -l -m -x <mach-o>
ASLR(Address Space Layout Randomization)
让Mach-O文件在虚拟内存中的起始地址随机