Ïðîöåññ çàãðóçêè (loading) ñîñòîèò â ðàçìåùåíèè ñîäåðæèìîãî ôàéëà â ïàìÿòè è ðàçðåøåíèè ññûëîê (relocate links).
Ðàçðåøåíèå ññûëîê (relocation) – ýòî ïðîöåññ ñâÿçûâàíèÿ ññûëîê íà ñèìâîëû ñ îïðåäåëåíèÿìè ýòèõ ñèìâîëîâ. Íàïðèìåð, âûçîâ ôóíêöèè äîëæåí ïåðåäàâàòü óïðàâëåíèå íà àäðåñ ýòîé ôóíêöèè.
Ôàéëû ñ ïåðåìåùàåìûì êîäîì ñîäåðæàò èíôîðìàöèþ, îïèñûâàþùóþ, êàê ìîäèôèöèðîâàòü ñîäåðæèìîå ñåêöèé ïðè ðàçìåùåíèè â ïàìÿòè. Ýòà èíôîðìàöèÿ íàçûâàåòñÿ relocation entries – òàáëèöà ïåðåìåùåíèé.
Êàæäàÿ çàïèñü òàáëèöû ïåðåìåùåíèé ñîäåðæèò âèðòóàëüíûé àäðåñ ññûëêè è èíôîðìàöèþ î åå ðàçðåøåíèè. Èíôîðìàöèÿ î ðàçðåøåíèè, íàïðèìåð, äëÿ âûçîâà ôóíêöèé – ýòî èíäåêñ ôóíêöèè â òàáëèöå ñèìâîëîâ.
Ôîðìàò çàãðóæàåìîãî (âûïîëíÿåìîãî) ôàéëà îáû÷íî îòëè÷àåòñÿ îò åãî îáðàçà â îïåðàòèâíîé ïàìÿòè.
Íåêîòîðûå ÷àñòè (ñåêöèÿ “heap”, íàïðèìåð) ïîÿâëÿþòñÿ òîëüêî ïðè çàãðóçêå â ïàìÿòü, íåêîòîðûå – íàîáîðîò, ïîñëå çàãðóçêè â ïàìÿòü èñ÷åçàþò.
 ôîðìàòå ELF îïðåäåëåíî 16 ðàçëè÷íûõ òèïîâ ñåêöèé. Äëÿ ïðàâèëüíîãî ðàçìåùåíèÿ ñåêöèè â ïàìÿòè äîñòàòî÷íî çíàòü òðè åå õàðàêòåðèñòèêè:
- çàíèìàåò ëè îíà ìåñòî â ïàìÿòè âî âðåìÿ âûïîëíåíèÿ: áèò SHF_ALLOC â àòðèáóòàõ ñåêöèè (ïîëå “sh_flags” â õåäåðå ñåêöèè);
- ðàçìåð ñåêöèè â áàéòàõ: ïîëå “sh_size” â õåäåðå ñåêöèè;
- çàíèìàåò ëè îíà ìåñòî â ôàéëå: çíà÷åíèå SHT_NOBITS ïîëÿ “sh_type” â õåäåðå ñåêöèè.
Ëèíêåð ïðè ñâÿçûâàíèè îáúåêòíûõ ôàéëîâ ìîæåò ãåíåðèðîâàòü êàðòó ïàìÿòè (map) çàãðóæàåìîãî ôàéëà. Ýòà êàðòà ÷àñòî èñïîëüçóåòñÿ â îòëàäî÷íûõ öåëÿõ.  íåé ïðèâåäåíû ñâåäåíèÿ î ðàñïîëîæåíèè ñïåöèàëüíûõ ñåêöèé â ïàìÿòè, î ðàñïîëîæåíèè äàííûõ è èíñòðóêöèé âíóòðè ñåêöèé è ò.ä.
.bss – ñåêöèÿ ñîäåðæèò íåèíèöèàëèçèðîâàííûå äàííûå. Ïî óìîë÷àíèþ èíèöèàëèçèðóåòñÿ íóëÿìè. Ýòà ñåêöèÿ íå çàíèìàåò ìåñòî â ôàéëå, òî åñòü èìååò òèï “SHT_NOBITS”.
.data è .data1 – ñåêöèÿ ñîäåðæèò èíèöèàëèçèðîâàííûå äàííûå.
.rodata è .rodata1 – ñåêöèÿ ñîäåðæèò äàííûå ñ äîñòóïîì «òîëüêî íà ÷òåíèå». Îáû÷íî ðàçìåùàåòñÿ â non-writable ñåãìåíòå ïàìÿòè.
.text – ñåêöèÿ ñîäåðæèò èíñòðóêöèè ïðîãðàììû.
 ïðèâåäåííîì íèæå ïðèìåðå C-ïðîãðàììû èíñòðóêöèè áóäóò ðàçìåùåíû â ñåêöèè “.text”, ïåðåìåííàÿ “str” áóäåò ðàçìåùåíà â ñåêöèè “.data”, à ïåðåìåííàÿ “N” – â “.bss”:
int N;
char str[] = “Hello, World!”;
int main ()
{
printf (str);
return 0;
}
Ðèñóíîê 1. Ôîðìàò OBJ-ôàéëà
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;// ñìåùåíèå òàáëèöû
Elf32_Off e_shoff; // ñìåùåíèå òàáëèöû õåäåðîâ ñåêöèé / 0
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
typedef struct {
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags; // Àòðèáóòû ñåêöèè
Elf32_Addr sh_addr;
Elf32_Off sh_offset; // ñìåùåíèå ñåêöèè îòíîñèòåëüíî íà÷àëà ôàéëà
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
Èìÿ àòðèáóòà |
Áèò àòðèáóòà âî ôëàãå ñåêöèè |
Îïèñàíèå |
SHF_WRITE |
0x1 |
Äàííàÿ ñåêöèÿ ñîäåðæèò äàííûå, êîòîðûå ìîãóò áûòü ïåðåçàïèñàíû âî âðåìÿ âûïîëíåíèÿ ìîäóëÿ |
SHF_ALLOC |
0x2 |
Äàííàÿ ñåêöèÿ çàíèìàåò ìåñòî â ïàìÿòè âî âðåìÿ ïðîöåññà âûïîëíåíèÿ. Íåêîòîðûå ñåêöèè íå ðàçìåùàþòñÿ â îáðàçå ìîäóëÿ, íàõîäÿùåìñÿ â ïàìÿòè, äëÿ íèõ ýòîò àòðèáóò âûêëþ÷åí |
SHF_EXECINSTR |
0x4 |
Äàííàÿ ñåêöèÿ ñîäåðæèò âûïîëíÿåìûå ìàøèííûå êîìàíäû |
SHF_MASKPROC |
0xF0000000 |
Âñå áèòû äàííîãî àòðèáóòà çàðåçåðâèðîâàíû äëÿ ñïåöèôèêè ïðîöåññîðîâ |
Òàáëèöà 1. Àòðèáóòû ñåêöèé