hallo-sys.c
befinde sich folgendes Programm:
#include <unistd.h> char buf[7] = "Hallo\n"; int main() { write(1, buf, 6); return 0; }
write(1, buf, 6);
? Welche
Bedeutung haben die Parameter? Kunsulieren Sie das Manual (die
"man-pages").
write
schreibt Daten in eine Datei. Die Daten liegen in
buf
mit der länge count
. Der erste
Parameter fd
ein File-Deskriptor einer offenen Datei.
Die Deskriptoren für die Standardaus- und eingabe sind von
vornherein offen.
Welche das sind, steht in unistd.h
:
#define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
gcc -S -o hallo-sys.s hallo-sys.cin (GNU-) Assemblercode.
as -o hallo-sys.o hallo-sys.sin Objektcode. Stellen Sie die Größe des erzeugten Objektcodes fest.
-rw-r--r-- 1 cjw users 94 Apr 11 17:13 hallo-sys.c -rw-r--r-- 1 cjw users 872 Apr 11 17:22 hallo-sys.o -rw-r--r-- 1 cjw users 459 Apr 11 17:14 hallo-sys.s -rw-r--r-- 1 cjw users 1511 Apr 11 17:22 index.html
hallo-sys.o
und erlätern Sie dessen Fehlermeldungen.
Die Fehlermeldung:
ld: warning: cannot find entry symbol _start; defaulting to 08048080 hallo-sys.o: In function `main': hallo-sys.o(.text+0x13): undefined reference to `write'Der Binder kann die Einsprungadresse
_start
für das
Programm nicht finden. Ausserdem findet er die Funktion write
nicht.
gcc
bindet das Programm folgendermaßen:
/usr/lib/gcc-lib/i486-suse-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hallo-sys /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i486-suse-linux/2.95.2/crtbegin.o -L/usr/lib/gcc-lib/i486-suse-linux/2.95.2 -L/usr/i486-suse-linux/lib hallo-sys.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i486-suse-linux/2.95.2/crtend.o /usr/lib/crtn.o