gcc make gdb strace objdump --------------------------- - che versioni di gcc, make e gdb stai usando? - sai vedere una lista di tutte le opzioni di gcc? - Scrivi un programma in C di nome "calc" che permetta di fare la somma di due numeri o la sottrazione tra due numeri. Il programma si deve poter usere cosi': $ calc 3 + 5 8 $ calc 5 - 3 2 L'output deve andare su standard output. Compila, esegui e verifica il funzionamento. - considera calc, considera la parte di codice che fa la somma e mettilo in una funzione somma() (decidi tu il tipo dei parametri e del valore di ritorno). Fai la stessa cosa per la sottrazione. Compila, esegui e verifica il funzionamento. - dividi il programma calc in 3 unita' di compilazione calc.c (contiene il main), somma.c (contiene la funzione somma()) e sottrazione.c (contiene la funzione sottrazione()). Probabilmente dovrai fare degli include files (.h). Compila, esegui e verifica il funzionamento. - Scrivi un makefile per calc. Verifica il funzionamento. - Il tuo makefile fa uso di regole in cui il target e le dipendenze sono esplicite? Se si, semplifica il makefile in modo da sfruttare la regola implicita "%.o: %.c" che e' predefinita in make. Verifica il funzionamento. - aggiungi al makefile un target "clean" che pulisca i .o e eventuali file di backup creati dal tuo text editor. Ma non cancelli l'eseguibile. Verifica il funzionamento. - aggiungi al makefile un target "delete" che faccia tutto cio' fa clean e in piu' cancelli anche l'eseguibile. Usa il target clean come una subroutine facendo dipendere delete da clean. Verifica il funzionamento. - il tuo proramma e' linkato in maniera dinamica? verificalo. - aggiungi al makefile un target "calc_static" per ottenere un eseguibile calc_static linkato staticamente. Verifica il funzionamento del makefile. - verifica che il prodotto calc_static di tale target sia linkato staticamente. - aggiungi a calc la possibilita' di fare radici quadrate: $ calc sqrt 4 2 inserisci tale funzionalita' in un nuovo file "radice.c", fai l'eventuale .h corrsipondente aggiorna il makefile. Sistema eventuali errori di link (consulta l'opzione -l di gcc) - Considera questa ultima versione di calc con link dinamico. Mostra le librerie dinamiche linkate. - Usa objdump per ispezionare il contenuto dell'eseguibile calc. Mostra il codice assembly della funzione main() (--disass). Comparalo con il codice C che hai scritto. Riesci a capire il codice assemply, almeno a grandi linee? (dove viene fatta la somma, la sottrazione, la radice?) - Aggiorna il makefile perche' si possa utilzzare agevolmente gdb con calc. (ricordati di compilare con l'opzione giusta) - Fai girare calc in gdb. - Aggiorna il makefile con un traget "release" che dia un eseguibile linkcato dinamicamente, senza simboli di debug e compilato con l'opzione -O2 (cosa fa questa opzione?). - Carica calc (versione linkata dinamicamente e senza opzione -O2) dentro gdb e mostra il codice assembly da gdb delle quattro funzioni di calc (usa il comando disass di gdb). Quali sono gli indirizzi di memoria virtuale degli entry point delle quattro funzioni? - In gdb puoi usare il comando "info target" per ispezionare le sezioni in cui e' divisa la memoria. Usa tale comando su calc. Metti un breakpoint su main. Esegui e quando il breakpoint viene colpito dai "info target". Avrai una lista delle zone di memoria che sono conosciute da gdb. In che zona stanno le quattro funzio di calc? - Compara il risultato ottenuto in con quello che ottieni con il comando "objdump -h calc". Le zone che gdb conosce in piu' rispetto a objdump a cosa sono dovute? - Ancora in gdb. A che indirizzo viene caricata la funzione sqrt()? e printf? confronta la zona in cui vengono caricate main, printf e sqrt. come is chiamano il nomi delle sezioni? da che file provengono? - metti un breakpoint su main() e esegui step-by-step - mostra le system call effettuate da una esecuzione di calc usando il comando strace. - mostra le system call effettuate da una esecuzione di ls (confrontale con quelle di calc). - alcuni parametri delle system call sono sostituiti con "..." come si fa a vedere le stringhe per intero?