当前位置: 首页 > article >正文

移除静态库中多余的符号

生成库的时候,只想暴露接口符号给调用者,其他的符号需要删除,怎么办?

方法1

#hidden符号增加local flag
objcopy --strip-uneeded --localize-hidden libxxx.a

#根据need_globals_symbols_list.txt,将其中所有符号设置为global
objcopy --globalize-symbols=need_globals_symbols_list.txt libxxx.a

#移除local符号
strip -x libxxx.a

#移除其他非local符号
strip -N sym_name libxxx.a

#保留某些符号
strip -s -K sym_name

#轻度混淆,重命名section和无法strip的symbol
objcopy --redefine-sym old_sym=new_sym libxxx.a
objcopy --rename-section old_sect=new_sect libxxx.a

 

这个方法适合没有源码的情况,缺点有:

    1.原始库需要被删除的符号必须是hidden (即编译时参数 -fvisibility=hidden 或手动指定 __attribute((visibility("hidden")))   ),否则objcopy无法将其设置为local,也就无法被strip -x移除,当然用strip -N strip -s -K也可以,就是麻烦。

    2.当原始库需要被删除的符号是内部调用的符号(例如source1.c 中调用了source2.c的函数),不管是不是hidden,此符号都处于relocation,无法被strip移除,只能--redefine-sym --rename-section一个个修改混淆。即便如此,该符号的地址依然存在,objdump nm都可以看到。

方法2

#源码里,需要暴露的符号用__attribute((visibility("default"))),编译时增加参数
gcc -c *.c -o output.o -fvisibility=hidden

#链接
ld -r output.o --gcsections --gc-keep-exported -o libxxx.o
gcc-ar rcs -o libxxx.o libxxx.a

缺点:

    1.需要有源码

    2.依然不会删除内部调用的符号


http://www.kler.cn/news/161302.html

相关文章:

  • Docker使用笔记
  • 详细解读python里的列表
  • 排序:直接选择排序
  • Elasticsearch:评估 RAG - 指标之旅
  • WebGL笔记:矩阵缩放的数学原理和实现
  • 【Flink on k8s】- 0 - Flink kubernetes operator 快速入门与实战
  • 【SQL开发实战技巧】系列(四十八):Oracle12C常用新特性☞多分区操作和管理
  • dtaidistance笔记:dtw_ndim (高维时间序列之间的DTW)
  • 嵌入式工程师校招经验与学习路线总结
  • 使用群晖Docker搭建HomeAssistant并实现异地公网访问家中智能设备
  • ES6与ES5的区别?
  • 排序:快速排序(hoare版本)
  • 分布式搜索引擎03
  • Docker 镜像构建的最佳做法
  • Rust国内sparse镜像源配置
  • 第十五届蓝桥杯模拟赛B组(第二期)C++
  • CAN总线协议编程实例
  • 前缀和例题:子矩阵的和AcWing796-Java版
  • Spark - 输出parqute文件
  • 漫谈Uniapp App热更新包-Jenkins CI/CD打包工具链的搭建
  • 【刷题日志】牛客 HJ73 计算日期到天数转换
  • Canvas鼠标画线
  • java字符串String类的常用方法
  • Swift 中 User Defaults 的读取和写入
  • 商家门店小程序怎么做?门店小程序的优势和好处
  • Docker 一些设置
  • zabbix配置snmp trap--使用snmptrapd和Bash接收器--图文教程
  • Android启动界面之isTaskRoot的妙用及Deeplink的处理
  • 从文字到使用,一文读懂Kafka服务使用
  • macOS 13.6上Sublime无法使用Package Control问题