运行 "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
的文件,其中包含编译器生成的程序集。
我正在使用以下 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
的文件,其中包含编译器生成的程序集。