objdump
显示二进制文件信息, 用来显示一个或者多个object文件的信息。
- 跨平台,可以查看ELF和mach-o文件
- 打印参数
- -h 打印段的基本信息
- -x 打印各个段的更详细信息
- -d 查看__TEXT代码段并反编译
- --private-header 查看mach-header
- 符号相关
- --syms 查看符号表
- --exports-trie 导出符号
- --indirect-symbols 查看间接符号表
- -syms 打印符号表
otool
object文件显示工具
- -l 显示解析后的mach header
- -h 显示未解析的 mach header
- -L 打印链接的动态库
clang
C, C++, and Objective-C 编译器/编译命令
- -x 指定编译文件语言类型: c, objective-c...
- -target x86_64 iOS macOS
- -g 生成调试信息
- -c 生成目标文件,只运行preproces compile和assemble,不link
- -o 输出文件
- -I{directory} 在指定目录寻找头文件 = header search path
- -L {dir} 在指定目录寻找库文件(.a/dylib) = library search path
- -l{library_name} 指定链接的库文件名称(.a/dylib) = other link flags -lAFNetworking
- -F{directory} 在指定目录寻找framework文件 = framework search path
- -framework <framework_name> 指定链接的framework名称 = other link flags -framework AFNetworking
- -flto LTO模式, full or thin
- clang -dynamiclib 创建动态库
- -install_name 动态库初次安装路径
ld
llvm linker链接器: 链接目标文件和库,并生成可执行程序/dylib
- -execute 链接成可执行程序, 默认选项
- -dylib -arch x86_64 -macosx_version_min 10.13 a.dylib -o a 链接生成动态库
- -static -arch x86_64 -e _main a.a -o a 链接生成静态库
- 链接参数
- -unexported_symbol 指定的全局符号不导出,外部不可见
- -exported_symbol
- -map xxx.xx 保存符号与macho文件的内存地址的映射关系到指定文件中
- -alias 给符号起别名
strip
移除库/可执行程序的符号, 来减少体积
- -X 移除本地符号
- -x 移除全部的本地符号,保留全局符号
- 无参数 代表全部符号
- -S 删除调试符号
- 移除原则
- 动态库 可以移除不是全局符号的其他符号
- App 移除本地 + 全局,保留间接符号表(引用其他动态库的符号)中的符号
- 静态库 不能移除重定位符号表,只能移除调试符号
nm
llvm nm: display 符号表中的 name list 信息
- -a 显示符号表全部符号
- -g 显示全局符号
- -u 显示未定义符号
符号类型
- U undefined(未定义)
- T text section symbol(__TEXT.__text)
- D data section symbol(__DATA.__data)
- B bss section symbol(__DATA.__bss)
- C common symbol
- I indirect symbol
dwarfdump
导出object files, archives, and .dSYM文件中DWARF调试信息
ar
压缩目标文件,并进行编号和索引,形成静态库
- -r 添加或替换文件
- -t 列出包含的目标文件
libtool
创建静态库
libtool -static -arch_only x86_64 a.o -o a.a
libtool -static -arch_only arm64 -D -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.plat
form/Developer/SDKs/iPhoneOS13.6.sdk test.o -o libTest.a
dsymutil
在可执行文件的对象文件中找到的DWARF调试信息, 并放在与可执行文件同名的.dsym包中。
- 读取debug map
- 从o文件读取DWARF
- 重新定位所有地址
- 将DWARF打包成dsym Bundle
dsymutil -f a -o a.dSYM
xcodebuild
build Xcode projects and workspace
lipo
创建通用二进制文件(xcode11后可以使用xcframework了)