我试过这个,但坚持回答下面的问题,其中 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
谁能帮我弄清楚以下问题的可能原因是什么?
size
命令没有为hello_world
或hello_world.o
列出堆栈或堆段。这背后的原因可能是什么? (对于上面的问题,答案是因为我没有调用任何函数,也没有使用任何堆段,所以他们没有出现在这里。我是对的吗?)hello_world-1.c
中没有全局变量。为什么size
报告 data 和 bss 段对于目标文件具有零长度> 但可执行文件的非零长度?size
和objdump
报告文本段的不同大小。您能否告知差异来自何处?
以上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/