移除、混淆静态库中多余的符号(待续)

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

方法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.依然不会删除内部调用的符号

相关推荐

  1. 混淆静态多余符号(待续)

    2023-12-08 10:08:01       60 阅读
  2. c# 数据 Deleted 为1数据

    2023-12-08 10:08:01       58 阅读
  3. MySQL 8.0功能(二)

    2023-12-08 10:08:01       45 阅读
  4. MySQL 8.0功能(一)

    2023-12-08 10:08:01       47 阅读
  5. LeetCode 2710.字符串尾随零

    2023-12-08 10:08:01       40 阅读
  6. 2710. 字符串尾随零

    2023-12-08 10:08:01       25 阅读
  7. 从字符串星号

    2023-12-08 10:08:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 10:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 10:08:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 10:08:01       82 阅读
  4. Python语言-面向对象

    2023-12-08 10:08:01       91 阅读

热门阅读

  1. 九、C#笔记

    2023-12-08 10:08:01       46 阅读
  2. Docker创建RocketMQ和RocketMQ控制台

    2023-12-08 10:08:01       62 阅读
  3. CEPH搭建

    2023-12-08 10:08:01       57 阅读
  4. 【Docker】安装Jenkins 亲测 傻瓜式安装

    2023-12-08 10:08:01       61 阅读
  5. 苍穹外卖项目(黑马)学习笔记

    2023-12-08 10:08:01       448 阅读
  6. 面试经典150题(3-4)

    2023-12-08 10:08:01       66 阅读
  7. Linux环境变量export命令笔记231207

    2023-12-08 10:08:01       70 阅读
  8. HttpURLConnection OOM问题记录

    2023-12-08 10:08:01       69 阅读
  9. ChatGPT(INSCODE AI 创作助手自动创作的)

    2023-12-08 10:08:01       102 阅读
  10. stm32中滴答定时器与普通定时器的区别

    2023-12-08 10:08:01       63 阅读
  11. 基于微信小程序的智慧校园导航系统研究

    2023-12-08 10:08:01       63 阅读
  12. AWS EC2使用 instance profile 访问S3

    2023-12-08 10:08:01       61 阅读
  13. C语言指针和内存管理

    2023-12-08 10:08:01       54 阅读