【发布时间】:2021-11-26 21:43:34
【问题描述】:
是否有工具可以分析二进制可执行文件中编译函数的大小及其依赖关系?
在我的例子中,程序是用 C++ 编写的,但我有兴趣分析的大多数依赖项都来自 C 库。平台是 Linux。
我的目标是减小程序的静态链接版本的大小。我正在考虑删除对库函数的调用(并实现我自己的替换),但在我开始做这项工作之前,我想知道哪些库函数造成的“膨胀”最多。
例如,考虑以下程序test.c:
int foo (int n) { return n+1; }
int main(int argc, char** argv) { return foo(argc)+1; }
当然,这是一个没有任何库的简单示例,但我将其用于说明目的。
我用gcc test.c编译这个。
objdump -d a.out 的输出包括以下内容:
0000000000001129 <foo>:
1129: f3 0f 1e fa endbr64
112d: 55 push %rbp
112e: 48 89 e5 mov %rsp,%rbp
1131: 89 7d fc mov %edi,-0x4(%rbp)
1134: 8b 45 fc mov -0x4(%rbp),%eax
1137: 83 c0 01 add $0x1,%eax
113a: 5d pop %rbp
113b: c3 retq
000000000000113c <main>:
113c: f3 0f 1e fa endbr64
1140: 55 push %rbp
1141: 48 89 e5 mov %rsp,%rbp
1144: 48 83 ec 10 sub $0x10,%rsp
1148: 89 7d fc mov %edi,-0x4(%rbp)
114b: 48 89 75 f0 mov %rsi,-0x10(%rbp)
114f: 8b 45 fc mov -0x4(%rbp),%eax
1152: 89 c7 mov %eax,%edi
1154: e8 d0 ff ff ff callq 1129 <foo>
1159: 83 c0 01 add $0x1,%eax
115c: c9 leaveq
115d: c3 retq
115e: 66 90 xchg %ax,%ax
我们可以在地址1154 看到main 调用foo。
所以我正在寻找能够告诉我以下信息的工具:
-
main的大小为 36 字节。 -
foo的大小为 19 个字节。 -
main及其依赖项的大小为 55 字节。(这是棘手的数字要计算,因为该工具需要执行递归下降搜索来找到所有main所依赖的函数。) -
main依赖于以下函数:foo
如果该工具还告诉我函数使用的任何静态数据结构的大小,那将是一个额外的好处。
我发现了以下相关的 Stack Overflow 问题,但似乎没有一个答案提到可以进行我想要的依赖关系分析的工具。
Measure static memory usage for C++ ported to embedded platform
Analyzing an ELF binary to minimize its size
Tool to analyze size of ELF sections and symbol
puncover 看起来不错,但似乎缺少我想要的依赖关系分析。
【问题讨论】:
标签: c dependencies size analysis objdump