I am trying to understand the contents of an ELF relocatable object (*.o file), which appears to be a
Fortran file compiled to SPARC object code. I am looking at the sections below, which all look fine.
Note the .data
and .bss
sized 0xB4 and 0x12C respectively.
sh_type: SHT_NULL sh_flags: sh_offset: 00000000 sh_size: 00000000 sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000000 sh_entsize: 00000000
.shstrtab sh_type: SHT_STRTAB sh_flags: sh_offset: 00000034 sh_size: 00000052 sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000001 sh_entsize: 00000000
.text sh_type: SHT_PROGBITS sh_flags: xa sh_offset: 00000088 sh_size: 00002154 sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000008 sh_entsize: 00000000
.data sh_type: SHT_PROGBITS sh_flags: aw sh_offset: 000021E0 sh_size: 000000B4 sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000008 sh_entsize: 00000000
.bss sh_type: SHT_NOBITS sh_flags: aw sh_offset: 00002298 sh_size: 0000012C sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000008 sh_entsize: 00000000
.stab.index sh_type: SHT_PROGBITS sh_flags: sh_offset: 00002298 sh_size: 00000024 sh_link: 00000006 sh_info: 00000000 sh_addralign: 00000004 sh_entsize: 0000000C
.stab.indexstr sh_type: SHT_STRTAB sh_flags: sh_offset: 000022BC sh_size: 00000079 sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000001 sh_entsize: 00000000
.symtab sh_type: SHT_SYMTAB sh_flags: a sh_offset: 00002338 sh_size: 00000300 sh_link: 00000008 sh_info: 00000023 sh_addralign: 00000004 sh_entsize: 00000010
.strtab sh_type: SHT_STRTAB sh_flags: a sh_offset: 00002638 sh_size: 00000232 sh_link: 00000000 sh_info: 00000000 sh_addralign: 00000001 sh_entsize: 00000000
.rela.text sh_type: SHT_RELA sh_flags: a sh_offset: 0000286C sh_size: 00000150 sh_link: 00000007 sh_info: 00000002 sh_addralign: 00000004 sh_entsize: 0000000C
Looking at the symbols in the object file, I found some symbols explicitly allocated in the .data
and
.bss
sections (I've trimmed the list of symbols to what I believe is relevant to the questions) as
well as symbols that appear to be referring to large data objects (likely arrays given that this is
a Fortran program) in the SHN_COMMON
pseudo-section.
name type section value size
...snippage...
11 GPB.t5matp.i STT_OBJECT 4 .bss 000000A8 4
12 GPB.t5matp.x1 STT_OBJECT 4 .bss 000000B0 4
13 GPB.t5matp.xdenom STT_OBJECT 4 .bss 000000B8 4
14 GPB.t5matp.pbar STT_OBJECT 4 .bss 000000C0 4
...snippage...
31 GPB.t5matp.rgasx STT_OBJECT 3 .data 000000AC 4
32 GPB.t5matp.xmolm STT_OBJECT 3 .data 000000B0 4
33 STT_SECTION 5 .stab.index 00000000 0
34 STT_SECTION 6 .stab.indexstr 00000000 0
35 wrncom_ STT_OBJECT 65522 SHN_COMMON 00000008 800
36 wrnco2_ STT_OBJECT 65522 SHN_COMMON 00000008 6404
37 psiinc_ STT_OBJECT 65522 SHN_COMMON 00000008 6000000
38 psirec_ STT_OBJECT 65522 SHN_COMMON 00000008 4000000
39 psichc_ STT_OBJECT 65522 SHN_COMMON 00000008 3000000
40 psiloc_ STT_OBJECT 65522 SHN_COMMON 00000008 400000
41 psicoc_ STT_OBJECT 65522 SHN_COMMON 00000008 40000
42 psidoc_ STT_OBJECT 65522 SHN_COMMON 00000008 8000000
43 t5mat_ STT_FUNC 2 .text 00000028 756
44 apcad_ STT_NOTYPE 0 00000000 0
45 t5matp_ STT_FUNC 2 .text 00000520 7220
Reading the ELF docs (e.g. http://www.sco.com/developers/gabi/2003-12-17/ch4.sheader.html)
I read that symbols defined relative to SHN_COMMON
sections "...are common symbols, such
as FORTRAN COMMON or unallocated C external variables." The linker is supposed to allocate
space for the objects, but my question is: in which segment does this allocation occur?
Perhaps I'm missing something obvious, but it isn't clear to me which segment will end up
containing these objects. The combined size of the SHN_COMMON objects greatly exceeds the
specified sizes of the .data
and .bss
sections. Is there any other metadata that
guides the linker when it comes to SHN_COMMON sections?
mmap
, so it's not any specific segment. Think about it as a poor man'smalloc
emulation..bss
section, seeing as no indication is given in the file as to their final location?