Android NDK之Strip裁减so库

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/
  • 0
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

新根

编码不易,感谢大佬赏识

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值