静态库不要strip 太厉害

简介: 根据strip的功能表示,strip经常用来去除目标文件中的一些符号表、调试符号表信息,减少包的大小.我自己做了一函数库,同样的代码生成了一个mylib.so和一个mylib.a文件,之后使用了 strip mylib.so 和strip mylib.a 这两条命令去除一些符号表和调试符号表信息, 感觉这两个库文件的体积大小确实缩小了,使用 nm 命令也不会输出这两个库文件的符号清单.比较怪异的是我分别使用这两个去掉了符号信息的库文件时,效果竟然不一样。

根据strip的功能表示,strip经常用来去除目标文件中的一些符号表、调试符号表信息,减少包的大小.
我自己做了一函数库,同样的代码生成了一个mylib.so和一个mylib.a文件,之后使用了 strip mylib.so 和
strip mylib.a 这两条命令去除一些符号表和调试符号表信息, 感觉这两个库文件的体积大小确实缩小了,
使用 nm 命令也不会输出这两个库文件的符号清单.
比较怪异的是我分别使用这两个去掉了符号信息的库文件时,效果竟然不一样。
gcc -o ta  test.c  mylib.a  和 gcc -o tso test.c  -L. -lmylib.so 我连接动态库文件时,编译可以通过,
使用静态库文件时,报告错误,在mylib.a中实现的函数找不到。如果不对mylib.a文件进行strip命令的话,
编译可以通过,一切正常。
  关于这个问题,想请教一下各位,发布静态库文件(.a)时,是否有需要使用strip命令去掉了所有的符号列表信息?
有没有什么方法保证使用strip命令后也能正常使用该静态库文件? 为什么对so文件使用了strip命令后不会影响它
和测试程序的链接?而且对静态库文件就会链接不成功?


对应 *.o *.a 加参数. 不给参数的话当日会出事了。
       -g
       -S
       -d
       --strip-debug
           Remove debugging symbols only.

       --strip-unneeded
           Remove all symbols that are not needed for relocation processing.


因为*.o 是relocatable ELF文件。 *.a 算是*.o的集合。所以最多是使用--strip-unneeded参数,符号不能删除的太彻底。

 file dio dio.o 
dio:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

dio.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

目录
相关文章
|
Linux
Linux(5)WIFI/BT调试笔记
Linux(5)WIFI/BT调试笔记
941 0
|
JSON 自然语言处理 编译器
Alibaba.com瘦包40MB——业界最全的iOS包大小技术总结
前言包大小是衡量APP性能的一项重要指标,它直接影响用户的下载点击率(包太大不想下)、下载安装成功率(下载慢不用了)、APP卸载率(太占空间先删掉)。包大小的计算逻辑很简单,它是各种类型的文件占用磁盘大小相加。APP瘦身的技术却很复杂,代码文件的复杂度和编译器策略决定了可执行文件的大小,业务功能和工程架构决定了代码文件的复杂度。iOS APP瘦身,需要掌握的技能有XCode构建技术、LLVM编译器
4423 0
Alibaba.com瘦包40MB——业界最全的iOS包大小技术总结
|
Android开发
Android Studio中修改gradle插件版本和Gradle版本
Android项目中,我们一般要设置gradle插件版本和gradle版本。 项目根目录下的build.gradle文件中,通过classpath可以指定gradle插件的版本。
|
C++ 开发者 编译器
C/C++经典面试50题(挑重点整理)下
重点整理了C/C++经典面试题
22744 0
|
安全 Linux 数据处理
Linux命令strip详解
`strip`命令在Linux中用于移除可执行文件和库的符号表及调试信息,减小文件大小,提升运行效率。它的工作原理是删除文件中包含的函数名、变量名等信息。主要参数包括`-s`(移除所有符号)、`-g`(仅移除调试信息)等。在应用时要注意文件备份,因为该操作不可逆。最佳实践是在发布版本中使用,并结合构建流程自动化。
|
10月前
|
前端开发 C# Windows
解决Gradle下载缓慢的问题,将-bin改为-all
【11月更文挑战第15天】PropertyGrid 是一种用户界面组件,允许用户直观地查看和编辑对象属性。WPF 中虽无内置控件,但可通过组合 Expander 和 DataGrid 实现基本功能,或使用 PropertyTools 等第三方库获得更强大的功能。
227 1
|
Web App开发 Go iOS开发
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)|社区征文
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)|社区征文
|
JavaScript 前端开发 程序员
通过一篇文章带你解决如何加密代码任然可以运行
在实际生活中,作为程序员偶尔会因为资金不够用了选择去兼职写代码,当我们写完一个代码,将他发给某个公司的时候,我们经常会想到如何让目标公司看不见你写的源代码(源代码是你好不容易想出来的,难免不有些心疼嘛),但目标公司却可以运行他所需要的代码,下面我将讲解一种静态库的使用方法,来实现这个方法。
602 0
|
网络安全 数据安全/隐私保护
VSC通过 SSH 连接到远程服务器时,每次都需要输入密码
VSC通过 SSH 连接到远程服务器时,每次都需要输入密码
2790 0
|
自然语言处理 Java API
常见C++ 开源日志库的比较
常见C++ 开源日志库的比较
629 0