【问题标题】:Strange behaviour of size utility尺寸效用的奇怪行为
【发布时间】:2016-03-05 09:25:41
【问题描述】:

第一种情况:

#include <stdio.h>

int main(void)
{
    return 0;
}

尺寸输出:

text       data     bss     dec     hex filename

1115        552       8    1675     68b ./a.out

第二种情况:

#include <stdio.h>

int global;  // new line compared to previous case

int main(void)
{
    return 0;
}

大小输出:

text       data     bss     dec     hex filename
1115        552       8    1675     68b ./a.out

理想情况下应该是:

bss=12 and all other (text and data) same

第三种情况:

#include <stdio.h>

int global;

int main(void)
{
    static int i;  // new line compared to previous case
    return 0;
}

大小输出:

text       data     bss     dec     hex filename
1115        552      16    1683     693 ./a.out

这是正确的

为什么第二种情况的输出不正确?

【问题讨论】:

  • 你的优化标志是什么?
  • 它就像被编译器忽略了,因为它根本没有被使用。
  • 第三种情况,你保留global变量了吗?
  • 要明确说明,您需要查看文件中包含的 ELF 信息。我个人认为这与优化的变量无关。 bss 部分通常位于动态部分之前。动态部分需要 8 字节对齐。因此需要填充 bss 部分以确保动态部分从正确对齐开始。在第一种情况下,没有用户 bss 变量。但总是至少有一个 bss 符号__bss_start。所以 bss 的大小是 8。当添加一个 4 字节的 bss 变量时,它适合填充空间,因此整体 bss 大小不会改变。
  • 很可能它仅以 8 字节为单位分配 bss,而 stdio.h 或其他东西分配了 4 字节。您可以通过生成一个地图文件来确认这一点,该文件将列出这些段中所有内容的名称

标签: c linux data-segment


【解决方案1】:

您可能正在为 64 位架构进行编译,其中您将内存对齐为 8 个字节(64 位)。

像第一种情况一样简单的程序有一个 4 字节的起始 bss,但分配了 8 个字节用于对齐目的,因此当您声明 global 变量时,您填充了剩下 4 个字节。

声明另一个 4 字节变量将向 bss 添加 8 个字节,直到它也被填满,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多