48 lines
1.5 KiB
Markdown
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. |