Sto provando a disassemblare un programma per vedere un'istruzione di assemblaggio syscall (l'istruzione INT, credo) e il gestore con GDB e ho scritto un piccolo programma (vedi sotto) per esso che apre e chiude un file. Sono stato in grado di seguire la chiamata per fopen con GDB fino a quando non ha eseguito una chiamata. Quando ho provato a comunicare a GDB "disassembla 0x ...." (indirizzo della chiamata) ha risposto con "Nessuna funzione contiene l'indirizzo specificato". E 'possibile forzare GDB a smontare (o visualizzarlo in assembler nel miglior modo possibile) quell'indirizzo di memoria? Se é cosi, come?Come posso forzare il GDB a smontare?
#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() non è una chiamata di sistema, è una chiamata alla libreria standard C. E perché pensi che una chiamata di sistema debba essere effettuata tramite un'istruzione INT? –
Potrei sbagliarmi, ma ci è stato insegnato che le chiamate fopen alla fine portano a una chiamata di sistema al kernel per aprire il file e restituire un descrittore di file? – Patrick
Patrick: Sì, ma non ha bisogno di farlo in modo diretto. Normalmente chiama la funzione libc che quindi entra nel kernel. Ma chiamare il kernel può essere fatto non solo con int (questo è lento) ma con syscall/sysenter a seconda dell'architettura del processore ... – k3a