Systemy wbudowane
1.4. Skrypty konsolidatora
Konsolidator (ang. linker) to program który w trakcie procesu konsolidacji łączy podane pliki obiektowe i biblioteki statyczne tworząc plik wykonywalny. Pracą konsolidatora steruje plik konfiguracyjny zwany skiyptem konsolidatora. Określa on w których obszarach pamięci umieszczone mają być poszczególne fragment}' programy zwane sekcjami. W większości plików w formacie ELF znajdują się następujące sekcje: .tekst zawierająca binarny kod programu, .data zawierająca zainicjalizowane zmienne globalne oraz .bss zawierająca niezainicjalizowane zmienne lokalne. Informacje na temat sekcji występujących w danym pliku można uzyskać korzystając z narzędzia objdump pochodzącego z pakietu GNU Binutils. Znaczenie poszczególnych kolumn jest następujące: indeks, nazwa sekcji, rozmiar sekcji, Virtual Memory Address (adres w pamięci pod który sekcja musi zostać załadowana aby program działał poprawnie), Load Memory Address (adres w pamięci pod którym sekcja będzie załadowana do pamięci), położenie sekcji wyrażone jako przesunięcie od początku pliku ELF oraz wyrównanie danej sekcji w pamięci. Wyróżnienie adresów LMA oraz VMA pozwala miedzy innymi na umieszczenie sekcji .data w pamięci ROM znajdującej się pod adresem LMA i przeniesienie jej do pamięci VMA podczas startu systemu.
gdb-test@dmcs |
labl:~/gdb-te. |
t-example$ |
objdump |
h wyni k.e |
Lf |
wynik.elf: |
file format |
elf32-little | |||
Sections: Idx Name |
Size |
VMA |
LMA |
File off |
Algn |
0 .text |
00000988 |
20000000 |
20000000 |
00000080 |
2**4 |
CONTENTS |
ALLOC, LOAD, READONLY, CODĘ | ||||
1 .data |
00000068 |
00300000 |
20000988 |
00000a08 |
2**2 |
CONTENTS |
ALLOC, LOAD, DATA | ||||
2 .bss |
000000a8 ALLOC |
00300068 |
200009f0 |
00000a70 |
2**2 |
Powyższy przykład należy interpretować w następując}' sposób:
1. sekcja .text o rozmiarze 2440 bajtów (988h) będzie załadowana do pamięci pod adres 20000000h (kolumna VMA). Jednocześnie sekcja ta będzie przechowywana w pamięci przed uruchomieniem programu pod adresem 20000000h (kolumna LMA).
2. sekcja .data o rozmiarze 104 bajtów (68h) podczas uruchamiania programu musi zostać załadowana do pamięci pod adres 00300000h (kolumna VMA). Jednocześnie sekcja ta będzie przechowywana w pamięci przed uruchomieniem programu pod adresem 20000988h (kolumna LMA). Kopiowaniem danych spod adresów LMA do VMA zajmują się biblioteki startowe systemu.
3. sekcja .bss o rozmiarze 168 bajtów (A8h) musi zostać załadowana do pamięci pod adres 00300068h (kolumna VMA). Jednocześnie sekcja ta będzie przechowywana w pamięci przed uruchomieniem programu pod adresem 200009f0h (kolumna LMA).