programmieren-3-c/a1-4/README.md

48 lines
1.5 KiB
Markdown

# A1-4 Ergebnisse
Die `main.o` Datei enthält lediglich den Objektcode der `main` Funktion
Die `quadrat` Funktion ist nicht in der `main.o` Datei enthalten. Stattdessen gibt es eine Referenz auf die fehlende `quadrat` Funktion, die sich mit `nm` anzeigen lässt. Gleiches gilt für `printf`
```
$ nm main.o
U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
U printf
U quadrat
```
In dem Ordner `/usr/include` lässt sich die `stdio.h` Datei finden. Sie enthält den Funktionskopf der `printf` Funktion:
```
extern int printf (const char *__restrict __format, ...);
```
---
Anmerkung:
Hier lässt sich auch erkennen, warum `printf(quadrat(x))` nicht die erwartete Ausgabe liefert. Die `printf` Funktion erwartet als erstes Argument stehts einen "string" (bzw `char*`). Ein Integer würde zu unerwartetem Verhalten führen.
---
Der Präprozessor hat also die `stdio.h` Datei automatisch gefunden und eingebunden.
Die Position der `stdio.o` Datei ist von Gerät zu Gerät unterschiedlich. Für gewöhnlich liegt sie in einem Archiv namens `libc.a` in einem Unterordner von `/usr/lib`
```
# Dateien im Archiv auflisten, in der Liste nach stdio.o suchen
$ ar t /usr/lib/x86_64-linux-gnu/libc.a | grep -C1 ^stdio.o
...
stdfiles.o
stdio.o
strops.o
...
```
Wie sich erkennen lässt, ist die `stdio.o` Datei in dem Archiv vorhanden.
---
Der Linker hat nun sowohl die `quadrat.o` Datei, als auch die `stdio.o` Datei gefunden und eingebunden, um das die ausführbare Binärdatei zu erzeugen.