bialpio
bialpio

Reputation: 1024

What is the section for uninitialized global data?

I am a little confused as to where uninitialized global variables go in the ELF file. I have this simple program to test in which sections the variables will be located:

const int a = 11;
int b = 10;
int c;

int main()
{
    return 0;
}

I know that uninitialized global variable should be put into .bss section of ELF file, but objdump -h gives me the following output:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000a  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000004  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000044  2**2
                  ALLOC
  3 .rodata       00000004  00000000  00000000  00000044  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      00000024  00000000  00000000  00000048  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  00000000  00000000  0000006c  2**0
                  CONTENTS, READONLY

So the variable a goes to .rodata, b goes to .data, and c goes nowhere? When i change the code to:

int c = 0;

everything is as expected - .bss section has the length 4, but what happens with the variable c when it is not initialized?

Upvotes: 2

Views: 3395

Answers (1)

Mat
Mat

Reputation: 206689

It goes into a "common section". You can see it with objdump -t or by using nm.

I'm not quite sure I understand what this is about, but the reference to the ld -warn-common flag says this:

int i;

A common symbol. If there are only (one or more) common symbols for a variable, it goes in the uninitialized data area of the output file. The linker merges multiple common symbols for the same variable into a single symbol. If they are of different sizes, it picks the largest size. The linker turns a common symbol into a declaration, if there is a definition of the same variable.

(Found via the nm man page.) There is more information after that in the man page itself.

Upvotes: 1

Related Questions