当前位置: 首页 > 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/a/161302.html

相关文章:

  • 论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》
  • GPT-O3:简单介绍
  • JVM实战—2.JVM内存设置与对象分配流转
  • 数据科学与SQL:如何利用Oracle 计算正态分布概率密度?
  • 牛客周赛73B:JAVA
  • 湖南引力:低代码助力实现智慧养老管理系统
  • 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打包工具链的搭建