Dead Code Stripping

492 阅读1分钟

dead_strip

Dead_Strip只是给开发者提供了一种优化代码的方式,Dead_Strip-noall_load-all_load-ObjC以及-force_load没有太大关系-noall_load、-all_load、-ObjC以及-force_load只是在连接静态库的时候起作用.

#import <Foundation/Foundation.h>
//#import "TestExample.h"
// 全局

void global_function() {
}

int main(){
    global_function();
    NSLog(@"testApp----");
//    TestExample *manager = [TestExample new];
//    [manager lg_test: nil];
    return 0;
}

准备脚本将test.m编译成可执行文件,先将test.m编译成静态库test.o文件,再将TestExample.m编译成静态库TestExample.o,最后通过将test.o连接TestExample.o生成可执行文件,我们直接执行脚本

image.png

SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk

FILE_NAME=test

HEADER_SEARCH_PATH=./StaticLibrary


echo "-----开始编译test.m"

clang -x objective-c \

-target x86_64-apple-macos11.3 \

-fobjc-arc \

-isysroot $SYSROOT \

-I${HEADER_SEARCH_PATH} \

-c ${FILE_NAME}.m -o ${FILE_NAME}.o


echo "-----开始进入StaticLibrary"

pushd ./StaticLibrary


clang -x objective-c \

-target x86_64-apple-macos11.3 \

-fobjc-arc \

-isysroot $SYSROOT \

-c TestExample.m -o TestExample.o


ar -rc libTestExample.a TestExample.o

echo "-----开始退出StaticLibrary"

popd

echo "-----开始test.o to test EXEC"

clang -target x86_64-apple-macos11.3 \

-fobjc-arc \

-isysroot $SYSROOT \

-L./StaticLibrary \

-lTestExample \

${FILE_NAME}.o -o ${FILE_NAME}


以上脚本即可得到test可执行文件
查看__TEXT objdump --macho -d test

WeChat9279397ced6e73cdd47b4c64418a6d50.png

  • 对脚本进行改进

脚本默认的为-noall_load,它不会将没有用过的代码放入到静态库

clang -target x86_64-apple-macos11.3 \

-fobjc-arc \

-isysroot $SYSROOT \

-Xlinker -all_load \

-L./StaticLibrary \

-lTestExample \

${FILE_NAME}.o -o ${FILE_NAME}

运行脚本,查看__TEXT objdump --macho -d test

WeChat099211c6bc264fb7d138593714eeb9c9.png 多了很多东西,而且未使用的TestExample也导入到项目中

  • dead_strip 定义 删除没有被入口点或者导出符号使用过的代码
clang -target x86_64-apple-macos11.1 \

-fobjc-arc \

-isysroot $SYSROOT \

-Xlinker -dead_strip \

-L./StaticLibrary \

-lTestExample \

${FILE_NAME}.o -o ${FILE_NAME}

运行脚本,查看__TEXT objdump --macho -d test

导出的符号表中并没有global_function,这就是-dead_strip作用

  • 调用下global_function方法 把test.m 注释打开 运行脚本,查看__TEXT objdump --macho -d test

发现global_function在符号表

总结Dead_Strip

  • 1.没有被入口点使用就会被干掉
  • 2.没有被导出符号使用的也会被干掉

-all_load

继续修改脚本进行改进 如下

clang -target x86_64-apple-macos11.1 \

-fobjc-arc \

-isysroot $SYSROOT \

-Xlinker -dead_strip \

-Xlinker -all_load \

-L./StaticLibrary \

-lTestExample \

${FILE_NAME}.o -o ${FILE_NAME}

运行脚本,查看__TEXT objdump --macho -d test

发现global_function在符号表中 OC代码也在

OC代码动态运行的代码,所以不会干掉

已上面对Dead_Strip和-noall_load、-all_load、-ObjC以及-force_load没有太大关系应该就有了更好的理解