Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Data section in a.out

here is a simple code that I executed

int a;
int main()
{
    return 0;
}

Then after compiling with gcc I did

size a.out

I got some output in bss and data section...Then I changed my code to this

int a;
int main()
{
    char *p = "hello";
    return 0;
}

Again when I saw the output by size a.out after compiling , size of data section remained same..But we know that string hello will be allocated memory in read only initialized part..Then why size of data section remained same?

like image 206
user1205088 Avatar asked Sep 27 '12 07:09

user1205088


People also ask

What is .data and .bss section?

What is the difference between the Data and BSS sections? BSS refers to uninitialized global and static objects and Data refers to initialized global and static objects. Both BSS and Data usually refer to RAM objects.

What is data section of memory?

A data segment is a portion of the virtual address space of a program, which contains the global variables and static variables that are initialized by the programmer. Note that, the data segment is not read-only, since the values of the variables can be altered at run time.

What is BSS part of data segment?

In computer programming, the block starting symbol (abbreviated to . bss or bss) is the portion of an object file, executable, or assembly language code that contains statically allocated variables that are declared but have not been assigned a value yet. It is often referred to as the "bss section" or "bss segment".

What is data text and BSS?

'text' is my code, vector table plus constants. 'data' is for initialized variables, and it counts for RAM and FLASH. The linker allocates the data in FLASH which then is copied from ROM to RAM in the startup code. 'bss' is for the uninitialized data in RAM which is initialized with zero in the startup code.


3 Answers

#include <stdio.h>

int main()
{
return 0;
}

It gives

   text    data     bss     dec     hex filename
    960     248       8    1216     4c0 a.out

when you do

int a;
int main()
{
    char *p = "hello";
    return 0;
}

it gives

   text    data     bss     dec     hex filename
    982     248       8    1238     4d6 a.out

at that time hello is stored in .rodata and the location of that address is stored in char pointer p but here p is stored on stack

and size doesnt shows stack. And i am not sure but .rodata is here calculated in text or dec.


when you write

int a;
char *p = "hello";
int main()
{
    return 0;
} 

it gives

   text    data     bss     dec     hex filename
    966     252       8    1226     4ca a.out

now here again "hello" is stored in .rodata but char pointer takes 4 byte and stored in data so data is increment by 4

For more info http://codingfreak.blogspot.in/2012/03/memory-layout-of-c-program-part-2.html

like image 103
Jeegar Patel Avatar answered Sep 30 '22 15:09

Jeegar Patel


Actually, that's an implementation detail. The compiler works by an as-is principle. Meaning that as long as the behavior of the program is the same, it's free to exclude any piece of code it wants. In this case, it can skip char* p = "hello" altogether.

like image 26
Luchian Grigore Avatar answered Sep 30 '22 14:09

Luchian Grigore


The string "hello" is allocated in the section .rodata

like image 22
Serge Avatar answered Sep 30 '22 14:09

Serge