Linker — Änderungen 10755 → 10756

Zeile 52: Zeile 52:
  
 
Der gcc ruft selbstständig den Linker mit allen benötigten Libraries auf und erzeugt eine ausführbare Datei, die nun auch die Funktion printf() (sowie alle anderen Funktionen, die in stdio.h als extern deklariert wurden) enthält.
 
Der gcc ruft selbstständig den Linker mit allen benötigten Libraries auf und erzeugt eine ausführbare Datei, die nun auch die Funktion printf() (sowie alle anderen Funktionen, die in stdio.h als extern deklariert wurden) enthält.
 +
 +
== Linkerskript ==
 +
Ein Linkerskript ist eine Datei, in der die Optionen für den Linker, insbesondere die Position der einzelnen Segmente im Speicher, festgelegt sind. Allerdings können alle Optionen auch als Kommandozeilenargument an den Linker übergeben werden.
 +
Ein Linkerskript ist insbesondere in der Betriebssystementwicklung von besonderer Bedeutung, da hier der Kernel an einen Teil im Speicher geladen wird, den der Linker von sich aus nicht kennt (z. B. wird der Bootloader an 0x7C00 geladen und GRUB kann den Kernel erst ab der Position 1 MB laden), anders als etwa Programme für MS DOS, die immer an die Adresse 0x100 geladen werden.
 +
 +
Ein Linkerskript könnte in etwa so aussehen (hier das Beispiel aus der Reihe [[OS-Dev_für_Einsteiger | OS-Dev für Einsteiger]], das man [[Teil_4_-_Hello_World#Multiboot-Header_in_einer_eigenen_Sektion | hier]] finden kann):
 +
<code>
 +
/*  Bei _start soll die Ausfuehrung losgehen */
 +
ENTRY(_start)
 +
 +
/*
 +
* Hier wird festgelegt, in welcher Reihenfolge welche Sektionen in die Binary
 +
* geschrieben werden sollen
 +
*/
 +
SECTIONS
 +
{
 +
    /*
 +
    * . ist die aktuelle Position in der Datei. Wir wollen den Kernel wie gehabt
 +
    * an 1 MB laden, also muessen wir dort die erste Sektion hinlegen
 +
    */
 +
    . = 0x100000;
 +
 +
    /*
 +
    * Der Multiboot-Header muss zuerst kommen (in den ersten 8 kB).
 +
    * Die Standardsektionen einfach hintereinander weg einbinden.
 +
    */
 +
    .text : {
 +
        *(multiboot)
 +
        *(.text)
 +
    }
 +
    .data ALIGN(4096) : {
 +
        *(.data)
 +
    }
 +
    .rodata ALIGN(4096) : {
 +
        *(.rodata)
 +
    }
 +
    .bss ALIGN(4096) : {
 +
        *(.bss)
 +
    }
 +
}
 +
</code>
  
 
[[Kategorie:Werkzeuge]]
 
[[Kategorie:Werkzeuge]]
  
 
[[en:Linkers]]
 
[[en:Linkers]]