【发布时间】:2015-07-05 04:29:04
【问题描述】:
我已经尝试过了,但坚持回答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 段对于 object file 的长度零长度,但 可执行文件的非零长度? -
size和objdump报告 文本段的不同大小。您能否告知差异来自何处?
我已尝试但未能就上述 3 个问题得出结论。感谢您在这方面的帮助。
【问题讨论】:
-
你没有全局变量,但你有全局数据:一个由 13 个
chars 组成的数组,对应于你的字符串字面量。加上可能在stdio.h中声明的任何内容。 -
对于#3:
size -A hello_world-1.o显示的文本段大小是否更接近objdump显示的大小?