Betriebssysteme Letschert - Übung 1-6

Aufgabe 6

In der Datei hallo-sys.c befinde sich folgendes Programm:
#include <unistd.h>
char buf[7] = "Hallo\n";
int main() {
  write(1, buf, 6);
  return 0;
}
  1. Was bedeutet der Aufruf 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.  */
    

  2. Übersetzen Sie das Programm mit dem Kommando
    gcc -S -o hallo-sys.s hallo-sys.c
    
    in (GNU-) Assemblercode.

    hallo-sys.s

  3. Übersetzen Sie den erzeugten Assemblercode mit dem Kommando
    as -o hallo-sys.o hallo-sys.s
    
    in 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
    

  4. Aktivieren Sie den Binder für die Objektdatei 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.

  5. Rufen Sie den Binder mit den richtigen Parametern so auf, dass er ausführbaren und statisch gebundenen Code erzeugt. Was wird also zu jedem Objektprogramm gebunden?

    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