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生成可执行文件
,我们直接执行脚本
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
- 对脚本进行改进
脚本默认
的为-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
多了很多东西,而且
未使用的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没有太大关系应该就有了更好的理解