加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:07:02 所属栏目:Linux 来源:网络整理
导读:我试过这个,但坚持下面的答案hello_world-1.c的问题 #include 执行的命令: [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-localdoma

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

#include

执行的命令:

[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,DATA
      2 .bss          00000000  00000000  00000000  0000006f  2**0
                      ALLOC
      3 .rodata       0000000c  00000000  00000000  0000006f  2**0
                      CONTENTS,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,DATA

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

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

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

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

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

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

.文本

.RODATA

.eh_frame

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

希望这可以帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读