As part of trying to write a compiler completely from scratch, I'm currently working on the part the handles ELF files.
After skimming through several articles and specifications about them, I still don't quite understand where section to segment mappings are stored. When observing small executables generated by NASM+ld, I can see that the .text section is somehow mapped onto a LOAD-type program header, but how?
A small piece of readelf's output when given a small (working) executable as input:
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000084 0x0000000000000084 R E 200000
Section to Segment mapping:
Segment Sections...
00 .text
Is this mapping even required to have a working executable? Or can they be omitted completely and you would still have a valid executable?
I still don't quite understand where section to segment mappings are stored.
They are not stored anywhere.
Rather, readelf
computes the mapping by looking at file offset and size of sections and segments.