Skip to content

strip&ld

ShenYj edited this page Feb 10, 2022 · 3 revisions

strip & ld

strip

作用: 剥离符号表

xcode设置路径

TARGETS-Build Settings-Deployment-Strip Style

Strip Style

直接修改Strip Style并不会生效, 在它上方由Deployment PostProcessing参数决定其是否生效, 默认是在打包的时候才会执行strip

Deployment PostProcessing

Deployment PostProcessing设置成YES后生效

strip

通过build日志课可见, xcode内置的strip执行时机在执行脚本之后(签名之前改写Mach-O中的内容, 签名后文件就不可变了), 也意味着在xcode build settings中设置并不能完成剥离符号表的操作


ld

需要将剥离操作提前, 在链接环节

链接器(ld)的作用: 把多个目标文件合并在一起, 在链接期间可以对目标文件进行操作

结合Xcode与终端交互xcode和终端实操演练的配置, 在xcconfig中增加如下设置

OTHER_LDFLAGS = -Xlinker -S
  • 命令补充

    • Xlinker: 实际上执行的是clang的命令, 后面的参数传给ld
    • -S: 链接时不要将debug information放入到输出的文件中 (效果相当于strip)

编译后, 查看xcode-Build Settings设置

ld

在之前nm的查看符号表输出结果

without-XLinker-S

增加OTHER_LDFLAGS = -Xlinker -S

OTHER_LDFLAGS = -Xlinker -S

明显输出信息减少, 通过链接器控制了目标文件中的符号信息(-S:调试信息不放入目标文件)


符号可见处理时机排序

  1. Xcode设置中的-O1 -Oz编译优化选项, 生成.o文件时的优化
  2. dead code strip 死代码剥离 链接过程中 (在dead strip 后还有 LTO)
  3. strip 剥离符号 已经生成Mach-O, 再去剥离 + 签名
strip -x:除了全局符号都可以移除 (动态库使用)
strip -S:移除调试符号(静态库使用) 
strip:除了间接符号表中使用的符号,其他符号都移除(上架App使用)

Getting Started

Social

Clone this wiki locally