2

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?

bialpio
  • 1,004
  • 7
  • 17

1 Answers1

1

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.

Mat
  • 202,337
  • 40
  • 393
  • 406
  • I see... So the only way for a loader to know how much space it needs to reserve for "common" variables is to look at the symbols in the ELF file? – bialpio Mar 26 '11 at 18:40