#include <stdio.h>
int main(void)
{
return 0;
}
我在 32 位 Linux 机器上使用 gcc 编译了上面的程序。然后我在可执行文件上运行 size 命令。我得到的结果如下:
text data bss dec hex filename
1415 544 8 1967 7af ./a.out
然后我添加 malloc 调用
#include <stdio.h>
int main(void)
{
char *ptr = malloc(sizeof(char)*4); //stored in heap
return 0;
}
然后我对可执行文件运行了 size 命令。我得到的结果如下:
text data bss dec hex filename
1504 600 8 2112 840 ./a.out
malloc 调用如何影响文本和数据大小
最佳答案
我在 x86-64 机器上使用 gcc -m32
(GCC 9.3.0) 编译了该示例。我得到的数字略有不同:
text data bss dec hex filename
1408 292 4 1704 6a8 a.out
1509 296 4 1809 711 a.out2
差异主要是由动态链接基础设施引起的,因为您添加了新的符号引用:
- 动态符号表
.dynsym
获得一个新条目(+16字节) - 随附的字符串表
.dynstr
获取函数名称的新条目,malloc
加上一个NUL字节(+7字节) - 符号版本表
.gnu.version
增长(+2字节) - 在
.rel.plt
中添加了一个新的重定位,以用malloc
的地址(+8字节)修复过程链接表 - 过程链接表
.plt
获得一个条目(+16字节) - 文本段
.text
本身增长主要是因为main在调用malloc
之前和之后需要一些指令来保存和恢复寄存器(+32字节) - 展开表
.eh_frame
增长(+20字节) - 全局偏移表
.got.plt
的一部分获得一个附加条目,以便于获取malloc
的地址(+4字节)
除最后一个之外的所有内容都计入 size
输出中文本的大小,如预期,总共多了 101 个字节的文本和 4 个字节的数据。
您可以使用objdump -h a.out
按段获取 segmentation 。
关于c - 堆初始化期间文本大小增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61463285/