1.Strip基本介绍
strip:
在类Unix和Unix的操作系统中,strip 程序可对可执行二进制程序和对象文件中,删除不必要的信息,从而带来更好的性能和减少磁盘空间的使用。“不必要的信息”指的是正常执行功能过程中,不需要的二进制信息,比方调试和符号信息。但该命令裁剪的程度,取决于开发者对这部分代码的具体实现。
此外,使用strip 可提高二进制文件在逆向工程中的安全性。如果没有二进制文件的信息和对象的名称,分析它将更加困难
常用的strip 命令:
- strip - s xxx.so : 移除所有符号信息(会覆盖原有带符号表的so)
- strip - S xxx.so: 移除调试符号信息
- strip - s xxx.so -o yyy.so: 移除所有符号信息,裁减好后,输出指定名字的so
不同架构的strip
在Android 手机中 cpu 架构是各不相同的,因此不同架构下要使用各自的strip 裁减对应的so库。
这里介绍下,主流适配是armv7和armv8 的ndk位置:
- armv8的strip位于:
xxx\sdk\ndk\22.1.7171670\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-strip.exe - armv7的strip 位于:
xxx\sdk\ndk\22.1.7171670\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-strip.exe
简单介绍完strip命令后,还得先了解下符号表。
2.符号表(Symbol table):
在计算机科学中,符号表(Symbol table)是语言翻译程序(如编译器或解释器)所使用的数据结构,其中程序源代码中的每个标识符(即符号)都与源代码中的声明或外观相关的信息相关联。换句话说,符号表的条目存储与条目对应符号相关的信息。
在这里插入符号表的实际使用:
- 在android开发中,集成了bugly 异常上报的小伙伴,可能比较熟悉。为了定位每个版本中出现的native crash的位置,应该上传对应版本的符号表(即带有符号表的so库)。
- 使用ndk-stack 处理native crash ,也是需要使用到带符号表的so库。
3.使用Strip裁减so库
拿到对应架构的so库,比如这里是arm64-v8a的so库进行 移除全部符号表 ,指定输出新的so库。
先知道arm64-v8a对应的strip 所在目录,执行以下命令:
效果如下图:
这里插入点小知识:在android studio中通过c++代码编译出strip 的so库,可以在cmake-list中添加:
#set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
参考教程:
- http://blog.itpub.net/69912579/viewspace-2759124/
|