iOS/MacOS编译链接常用命令

578 阅读3分钟

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包中。

  1. 读取debug map
  2. 从o文件读取DWARF
  3. 重新定位所有地址
  4. 将DWARF打包成dsym Bundle

dsymutil -f a -o a.dSYM

xcodebuild

build Xcode projects and workspace

lipo

创建通用二进制文件(xcode11后可以使用xcframework了)