c - 堆初始化期间文本大小增量

标签 c

#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/

相关文章:

c - memsetting初始化缓冲区的原因是什么

c - 在 C 中声明结构数组时的奇怪之处

c - void main 和 int main 的区别

c - 段错误(核心转储)但不知道如何修复

c - printf 中的格式字符串

c - 在c中实现通用堆栈

c - 在数组访问/下标中反转操作数的原因

c - 获取窗口的输入元素

c - 如何限制输入的字符数

c - 如何从最新的lua 5.3调用c dll