S_FILES = $(wildcard *.s) S_O_FILES = $(subst .s,.o,$(S_FILES)) EXE_FILES = $(subst .o,,$(S_O_FILES)) EXE_FILES_GDB = $(subst .o,.gdb,$(S_O_FILES)) AS = as -g LD = ld # Il faut probablement décommenter les 2 lignes suivantes sur un Mac # AS = clang -g -c # LD = clang -g -nostartfiles -nostdlib instructions: @echo "utilisez la commande" @echo " $ make FICHIER.gdb" @echo "pour compiler FICHIER.s et le lancer dans gdb" all: $(EXE_FILES) $(EXE_FILES):%: %.o # link to executable $(LD) $< -o $@ $(S_O_FILES):%.o: %.s # assemble code $(AS) $< -o $@ $(EXE_FILES_GDB):%.gdb: % gdb.init # run gdb @gdb --quiet \ --init-command=gdb.init \ --eval-command="tbreak _start" \ --eval-command="tbreak main" \ --eval-command="run" \ $< @# NOTE: j'inclus un point d'arrêt sur main au cas où on essaie de faire le @# TP sur un mac, qui utilise visiblement "main" plutôt que "_start". clean: rm -f *.o $(EXE_FILES) a.out gdb.init gdb.init: @echo 'set disassembly-flavor intel' >> gdb.init @echo 'set pagination off' >> gdb.init @echo 'set confirm off' >> gdb.init @echo 'set history save on' >> gdb.init @echo '# set style enabled on' >> gdb.init @echo '# set print pretty on' >> gdb.init @echo '# set print array on' >> gdb.init @echo '' >> gdb.init @echo '# show stack values' >> gdb.init @echo 'define ss' >> gdb.init @echo ' set $$i = $$arg0 - 1' >> gdb.init @echo ' while $$i >= 0' >> gdb.init @echo ' set $$p = $$rsp + $$i*8' >> gdb.init @echo ' set $$v = *(long *)($$p)' >> gdb.init @echo ' printf "@0x%016lx: 0x%016lx %ld\\n", $$p, $$v, $$v' >> gdb.init @echo ' set $$i = $$i - 1' >> gdb.init @echo ' end' >> gdb.init @echo 'end' >> gdb.init @echo '' >> gdb.init @echo '# switch to source view' >> gdb.init @echo 'define src' >> gdb.init @echo ' layout src' >> gdb.init @echo ' layout regs' >> gdb.init @echo ' focus regs' >> gdb.init @echo 'end' >> gdb.init @echo '' >> gdb.init @echo '# switch to real assembly view' >> gdb.init @echo 'define asm' >> gdb.init @echo ' layout asm' >> gdb.init @echo ' layout regs' >> gdb.init @echo ' focus regs' >> gdb.init @echo 'end' >> gdb.init @echo '' >> gdb.init @echo '# default to source view' >> gdb.init @echo 'src' >> gdb.init .PHONY: all clean instruction