size和objdump报告文本段的不同大小

KK-*_*KK- 6 c linux gcc

我已经试过这一点,但卡住了以下问题的答案在hello_world-1.c

#include<stdio.h>
int main(void)
{
    printf("Hello world\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

执行的命令:

[kishore@localhost-localdomain ~]$ gcc -Wall -Wextra -c hello_world-1.c
[kishore@localhost-localdomain ~]$ gcc -o hello_world-1 hello_world-1.o
[kishore@localhost-localdomain ~]$ size hello_world-1 hello_world-1.o

    text    data    bss     dec    hex    filename
    1222     280      4    1506    5e2    hello_world-1
     139       0      0     139     8b    hello_world-1.o

[kishore@localhost-localdomain ~]$ objdump -h hello_world-1.o

    hello_world-1.o:     file format elf32-i386

    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         0000003b  00000000  00000000  00000034  2**0
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
      1 .data         00000000  00000000  00000000  0000006f  2**0
                      CONTENTS, ALLOC, LOAD, DATA
      2 .bss          00000000  00000000  00000000  0000006f  2**0
                      ALLOC
      3 .rodata       0000000c  00000000  00000000  0000006f  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      4 .comment      0000002d  00000000  00000000  0000007b  2**0
                      CONTENTS, READONLY
      5 .note.GNU-stack 00000000  00000000  00000000  000000a8  2**0
                      CONTENTS, READONLY
      6 .eh_frame     00000044  00000000  00000000  000000a8  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
Run Code Online (Sandbox Code Playgroud)

谁能帮助我弄清楚下面问题可能是什么原因?

  1. size命令没有列出栈或堆板块hello_worldhello_world.o.这背后可能是什么原因?(对于上面的问题,答案是因为我没有调用任何函数,也没有使用任何堆段,这就是为什么它们没有出现在这里.我是否正确?)
  2. 没有全局变量hello_world-1.c.为什么size报道说,数据BSS段具有长度为零目标文件,但不为零长度可执行文件
  3. sizeobjdump报告文本段的不同大小.你能否告知差异来自哪里?

我试过但未能就上述3个问题做出结论.感谢您对此的帮助.

dmi*_*try 12

1)堆栈和堆栈由OS在运行时创建; 也就是说,在将可执行文件加载到虚拟内存之后.因此,它们不是可执行文件的一部分.

2)因为可执行文件还包含来自stdio链接器链接到目标文件的库的数据和代码,请注意.

3)因为size,像这样调用(没有任何参数)根据伯克利惯例显示大小.在此方案下,text条目报告三个不同细分的组合大小:

.text

.rodata

.eh_frame

另一方面,只objdump报告大小.text.如果根据SysV约定调用它.text,您可以看到.rodata,和.eh_frame单独的大小size,如下所示:size -A hello_world-1.c.然后,您将看到与您看到的完全相同的信息objdump.

希望这可以帮助.