【问题标题】:Memory layout in BSS segmentBSS 段中的内存布局
【发布时间】:2015-07-25 07:01:54
【问题描述】:

在一个64位的机器上,我写了一个简单的C程序如下:

#include <stdio.h>
int main(int argc,char* argv[])
{
    printf("Hello,world!\n");
    return 0;
}

然后gcc hello.c -o hello,size hello,我得到了:

    text       data     bss     dec     hex filename
    1156        492      16    1664     680 hello

接下来,我在源码中添加了一个全局int变量:

#include <stdio.h>
int global;
int main(int argc,char* argv[])
{
    printf("Hello,world!\n");
    return 0;
}

再次编译和调整大小,我得到了:

    text       data     bss     dec     hex filename
    1156        492      24    1672     688 hello

那么,问题是,bss 段增加了 8 个字节,但为什么呢?只添加了一个 int 变量 global。那应该是 4。

顺便说一句,gcc 版本是 4.4.7

【问题讨论】:

  • 可能是元数据。您认为链接器应该如何解析全局名称?
  • 我会说它正在添加填充。我注意到如果你添加另一个全局,所以总共有两个,bss 大小保持不变,然后你添加另一个,它又跳了 8 .
  • 是的,你是对的!但是这样做的目的是什么?为什么它不简单地跳 4 跳 4?
  • 机器是 64 位的(不管这意味着什么)的细节足以保证对这个问题的特定是/否回答......因为不可能运行 32 - 64 位机器上的位操作系统!

标签: c memory memory-management


【解决方案1】:

段大小向上舍入到下一个 8 的倍数,因此它后面的任何内容都将在 64 位边界上对齐。无论如何,将其归零的启动例程将使用 64 位存储。

【讨论】:

  • 当我用初始化定义全局时,数据段跳了4,而不是8。数据段在内存分配上和BSS有区别吗?对不起,我不了解内部结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多