把原始笔记里的编译选项、静态分析和运行时观察点整理成一条更容易复用的体积排查链路。
先做编译期裁剪
最常用的一组组合是:
-ffunction-sections -fdata-sections -Wl,--gc-sections
它们的作用可以这样理解:
-ffunction-sections:每个函数单独放一个 section-fdata-sections:每个全局或静态变量单独放一个 section-Wl,--gc-sections:链接时回收没有被引用的 section
如果目标是尽量减小最终可执行文件或共享库体积,这通常是第一步。
用 bloaty 看体积主要花在哪
bloaty -d compileunits -n 0 libmicontinuity.so > 1.txt
适合回答两个问题:
- 哪些编译单元最占体积
- 优化应该优先从哪里下手
用 size -A 做静态分析
~/.toolchain/sdk_package_MC01/toolchain/bin/aarch64-openwrt-linux-size -A ./libmicontinuity_sdk.so.1.0.4032716
这一步更适合直接看各段大小,例如:
.text.rodata.data.bss
再看运行时映射
如果文件体积和进程占用看起来不一致,再补上运行时观察:
cat /proc/39625/status
cat /proc/39625/smaps
以及:
pmap <pid>
pmap 能快速帮你看出进程的内存映射布局,适合和 smaps 交叉确认。
导出符号控制
如果目标是减小导出符号面,原始笔记里还提到 version_script.map:
extern "c++" {
"class::*";
};
另外可以配合:
nm <binary>
c++filt <mangled_symbol>
用途分别是:
nm:先看当前符号表里到底暴露了什么c++filt:把 C++ 符号反解成人能读的名字
一条整理后的排查顺序
更适合回看的顺序是:
- 先加 section 级裁剪编译选项
- 用
bloaty看体积热点 - 用
size -A看段分布 - 用
smaps/pmap看运行时映射 - 最后再考虑缩减导出符号和 ABI 暴露面
FEATURED TAGS
Git
Cheat Sheet
Markdown
Tools
C++
Linker
Thread
Linux
TCP
Network
GDB
Debug
leetcode
链表
WSL
Ubuntu
Windows
Linux Kernel
GCC
Android
adb
Troubleshooting
Profiling
Sanitizer
glibc
MySQL
Database
Python
curl
Build
ELF
clang-format
CMake
Graphviz
Performance
vcpkg
Protobuf
排查
速查
内存
STL
调试
性能分析
性能
读书笔记
方法论
架构
网络
Timer
mbedTLS
TLS
安全
负载均衡
脚本
工具
LRU
二叉树
BST
中序遍历
回溯
二分查找
优先队列
排序
旋转数组
jenkins
部署