运行 "make buzz.s" 时获取 .elf 文件而不是 .s 文件

Getting a .elf file instead of a .s file when running "make buzz.s"

我正在使用以下 makefile:

 # Makefile for AVR lab1 - delay blink
 TARGET =    buzz
 #AFILES =   buzz.S
 CFILES =    buzz.c

 MCU    =    atmega328p
 F_CPU  =    16000000
 PORT   =    /dev/ttyACM0

 # do not modify anything below this line
 include        ~/lib/AVRmaster.mak

和以下包含的文件:

DCONF =     /usr/share/arduino/hardware/tools/avrdude.conf
OBJS =      $(CFILES:.c=.o) $(AFILES:.S=.o)

CFLAGS =    -Wall
CFLAGS +=   -Os
CFLAGS +=   -mmcu=$(MCU)
CFLAGS +=   -DF_CPU=$(F_CPU)UL
CFLAGS +=   -g$(DEBUG)
CFLAGS +=   -MMD -DUSB_VID=null -DUSB_PID=null
CFLAGS +=   -DARDUINO=105
CFLGS  +=   -D__PROG_TYPES_COMPAT__
CFLAGS +=   -I/usr/share/arduino/hardware/cores/arduino
CFLAGS +=   -I/usr/share/arduino/hardware/arduino/variants/standard
CFLAGS +=   -fno-exceptions
CFLAGS +=   -ffunction-sections
CFLAGS +=   -fdata-sections

AFLAGS  =   -mmcu=$(MCU) -I. -g -x assembler-with-cpp
AFLAGS +=   -DF_CPU=$(F_CPU)
AFLAGS +=   -Wa,-adhlns=$(<:%.S=%.lst),-gstabs,--listing-cont-lines=100

LDFLAGS =   -Wl,-Map=$(TARGET).map,--cref

ifeq     ($(INTCODE), FALSE)
LDFLAGS +=  -nostartfiles
endif

DFLAGS =    -C$(DCONF)
DFLAGS +=   -v -v -v -v
DFLAGS +=   -carduino
DFLAGS +=   -p$(MCU)
DFLAGS +=   -P$(PORT)
DFLAGS +=   -b115200
DFLAGS +=   -D

all:        $(TARGET).hex

%.o:        %.S
            avr-gcc $(AFLAGS) -c $< -o $@

%.o:        %.c
            avr-gcc $(CFLAGS) -c $< -o $@

$(TARGET).elf:      $(OBJS)
            avr-gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)

%.hex:      %.elf
            avr-objcopy -O ihex -j .text -j .data $< $@

%.s:        %.elf
            avr-objdump -D $< > $@

load:       $(TARGET).hex
            avrdude $(DFLAGS) -Uflash:w:$(TARGET).hex:i            

clean:
        rm -f *.hex *.elf *.o *.map *.d *.s *.lst

运行

make buzz.s

生成一个文件,其中大约一千行中的第一行是

 buzz.elf:     file format elf32-avr


 Disassembly of section .data:

我正在尝试创建我编写的 c 程序的汇编语言版本,并且允许从 c 源代码逆向工程一个完整注释的程序。 我不确定我是否能够对生成的内容进行逆向工程!

运行 make buzz.s 不会给你一个 .elf 文件。它为您提供的是一个纯文本文件,其中包含命令 avr-objdump -D buzz.elf 的输出。这是文件 buzz.elf 的完整反汇编输出。反汇编从 .data 部分开始,该部分通常不包含任何代码,因此文件以被错误反汇编为指令的数据开头。大概这看起来像垃圾。如果您向下滚动到此文件中 .text 部分的开头,您应该反汇编代码以及链接到程序中的任何库代码。

如果您想查看编译器的汇编输出,请尝试在您的 makefile 中的 include ~/lib/AVRmaster.mak 行之后添加这些行:

%.ss: %.c
    avr-gcc $(CFLAGS) -S $< -o $@

第二行开头需要有制表符。如果您将上面的内容剪切并粘贴到您的 makefile 中,您可能需要删除第二行开头的空格并将其替换为制表符。

这将允许您使用命令 make buzz.ss 生成名为 buzz.ss 的文件,其中包含编译器生成的程序集。