I have tried this, but stuck up to the answer below questions where hello_world-1.c
is
#include<stdio.h>
int main(void)
{
printf("Hello world\n");
return 0;
}
The executed commands:
[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
Can anyone please help me to figure out what might be the reasons for the questions below?
- The
size
command didn't list a stack or heap segment forhello_world
orhello_world.o
. What might be the reason behind this?
(for above question, the answer is as I didn't called any function and also not used any heap segment, that's why they didn't showed up here. Am I correct?) - There are no global variables in
hello_world-1.c
. Whysize
reports that the data and bss segments have zero length for the object file but non-zero length for the executable? size
andobjdump
report different sizes for the text segment. Can you please advise where the discrepancy comes from?
I have tried but failed to conclude on above 3 questions. Appreciate your help on this.
Best Answer
1) Heap and stack are created by the OS at run time; that is, after the executable has been loaded into virtual memory. Therefore, they are not part of the executable file.
2) Because the executable also contains data -- and code, mind you -- from the
stdio
library that has been linked to the object file by the linker.3) Because
size
, invoked like this (without any parameters) displays sizes according to the Berkeley convention. Under this scenario, thetext
entry reports the combined sizes of three different segments:.text
.rodata
.eh_frame
On the other hand,
objdump
reports the size of.text
only. You can see the sizes of.text
,.rodata
, and.eh_frame
separately withsize
if you invoke it according to the SysV convention, like this:size -A hello_world-1.c
. Then you will see exactly the same info you see withobjdump
.Hope this helps.