{{Stub}}
Ein '''Linker''' ist ein Programm, welches Objektdateien "zusammenkopiert" und mit anderen nötigen Dateien verbindet.
== Funktionsweise ==
Beispiel: Wir haben ein simples "Hallo-Welt"-Programm in C, welches Gebrauch von der Funktion printf() macht. Diese ist bekanntlich Teil der libc, also der Standardbibliothek von C. Beim Kompillieren wird das C-Programm in Maschinencode übersetzt.
Das erreicht man mit dem [[gcc]] so:
gcc -c -o hello.o hello.c
Nun wurde eine Objektdatei erstellt. Diese enthält sogenannte Referenzen auch Objekte, Funktionen usw..
Wenn wir uns also die erzeugte Datei per objdump -t anschauen, bekommen wir die Symboltabelle:
hello.o: file format elf32-i386
SYMBOL TABLE:
00000000 l df *ABS* 00000000 hello.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .rodata 00000000 .rodata
00000000 l d .note.GNU-stack 00000000 .note.GNU-stack
00000000 l d .comment 00000000 .comment
00000000 g F .text 0000002b main
00000000 *UND* 00000000 puts
Hier sehen wir die Referenzen, die noch nicht in der Datei enthalten sind: puts z.B..
Erst durch das Zusammenlinken mit anderen Objektdateien (hier: die der libc) wird der nötige Code in die Datei
eingelinkt und die Datei ausführbar gemacht:
== Linkerdatei ==
Eine Linkerdatei definiert, wo welche Sektionen des Codes liegen.
Hier ein Beispiel aus dem Betriebssystem Qultics:
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
kernel_start = phys;
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
kernel_end = end;
kernel_size = kernel_end - kernel_start;
}
[[Kategorie:Werkzeuge]]