Ich versuche ein Programm zu zerlegen, um eine syscall Assembly-Anweisung (die INT-Anweisung, glaube ich) und den Handler mit GDB zu sehen und habe ein kleines Programm geschrieben (siehe unten), das eine Datei öffnet und schließt. Ich konnte dem Aufruf folgen, mit GDB zu fopen, bis es einen Anruf ausführte. Als ich versuchte, GDB "disassemble 0x ...." (Adresse des Anrufs) zu sagen, antwortete es mit "Keine Funktion enthält angegebene Adresse." Ist es möglich, GDB zu zwingen, diese Speicheradresse zu zerlegen (oder so gut wie möglich in Assembler anzuzeigen)? Wenn das so ist, wie?Wie kann ich GDB zum Zerlegen zwingen?
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE* f;
f = fopen("main.c", "r");
if (!f) {
perror("open");
return -1;
}
fclose(f);
return 0;
}
fopen() ist kein Systemaufruf, es ist ein Aufruf an die C-Standardbibliothek. Und warum sollte ein Systemaufruf über eine INT-Anweisung erfolgen? –
Ich könnte falsch liegen, aber uns wurde beigebracht, dass fopen Aufrufe letztlich zu einem Systemaufruf an den Kernel führen, um die Datei zu öffnen und einen Dateideskriptor zurückzugeben? – Patrick
Patrick: Ja, aber muss das nicht direkt tun. Normalerweise ruft es die libc-Funktion auf, die dann in den Kernel eintritt. Aber Kernel aufrufen kann nicht nur mit int (das ist langsam), sondern mit syscall/sysenter je nach Prozessorarchitektur ... – k3a