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

标签 c linux gcc

我试过这个,但坚持回答下面的问题,其中 hello_world-1.c

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

执行的命令:

[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

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

  1. size 命令没有为 hello_worldhello_world.o 列出堆栈或堆段。这背后的原因可能是什么? (对于上面的问题,答案是因为我没有调用任何函数,也没有使用任何堆段,所以他们没有出现在这里。我是对的吗?)
  2. hello_world-1.c没有全局变量。为什么 size 报告 databss 段对于目标文件具有零长度> 但可执行文件非零长度
  3. sizeobjdump 报告文本段不同大小。您能否告知差异来自何处?

以上3个问题我都试过但没能得出结论。感谢您对此提供的帮助。

最佳答案

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

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

3) 因为 size,像这样调用(没有任何参数)根据 Berkeley 约定显示尺寸。在这种情况下,text 条目报告三个不同段的组合大小:

.text

.rodata

.eh_frame

另一方面,objdump 只报告 .text 的大小。如果你调用它,你可以看到 .text, .rodata, 和 .eh_frame 的大小与 size 分开根据 SysV 约定,像这样:size -A hello_world-1.c。然后您将看到与使用 objdump 时完全相同的信息。

希望这对您有所帮助。

关于c - size 和 objdump 报告文本段的不同大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227153/

相关文章:

c - execvp 和参数类型 - ansi c

c - 段错误 - 字符指针

c++ - 错误 LNK2001 : unresolved external symbol

c - arm-none-eabi-gcc : SECTIONS: unclear syntax *<archivename>. a:

gcc - GNU 程序集内联 : what do %1 and %0 mean?

c - 如何修复我的 raycaster 中的扭曲透视?

Java processbuilder 和使用环境变量

php - 在 PHP 中,如何测量请求使用硬盘的时间?

linux - 在来自两个不同进程的相同文件描述符上调用 ioctl

我们可以使用 union 进行类型转换吗?