使用llvm-objcopy移除Mach-O静态库符号失败求助
解决Mach-O静态库符号移除失效的问题
为啥直接处理.a文件没用?
Mach-O格式的静态库(.a)不是单个编译产物,而是一堆.o目标文件的归档包。llvm-objcopy和llvm-strip直接扫整个归档文件时,不会自动深入处理里面的每个.o文件,所以你删符号的操作根本没作用到真正存符号的地方。
正确操作步骤
得先拆包、逐个处理、再重新打包,具体走这几步:
- 建个临时目录放拆解出来的文件
mkdir temp_obj && cd temp_obj
- 把静态库拆成单个.o文件
ar x ../library.a
- 给每个.o文件单独删符号
遍历所有.o文件,逐个执行符号移除:
for obj in *.o; do llvm-objcopy --strip-symbol "__ZNK7WebCore17JSDOMGlobalObject22scriptExecutionContextEv" "$obj" "$obj" done
这里直接覆盖原文件,要是怕出错可以先备份,或者指定新文件名再替换。
- 重新打包成新的静态库
ar rcs ../library-stripped.a *.o
- 清理临时文件
cd .. && rm -rf temp_obj
验证结果
用llvm-nm检查新库:
llvm-nm -A library-stripped.a | grep "__ZNK7WebCore17JSDOMGlobalObject22scriptExecutionContextEv"
这时候应该看不到该符号的T(符号定义)条目了。如果还有U(未定义引用),那是其他.o文件对这个符号的调用,除非你同时修改那些调用代码,否则这些引用是正常存在的,不用管。
关于llvm-strip的说明
llvm-strip的--strip-symbol参数逻辑和llvm-objcopy完全一样,同样得先拆静态库再处理单个.o,直接怼.a文件肯定没用。
内容的提问来源于stack exchange,提问作者Francisco Ryan Tolmasky I
相关产品推荐
相关产品推荐

