我使用以下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源代码中对完全注释的程序进行反向工程。 我不确定我是否能够对所生产的产品进行逆向工程!
答案 0 :(得分:0)
正在运行make buzz.s
并未提供.elf文件。它给你的是一个纯文本文件,其中包含命令avr-objdump -D buzz.elf
的输出。输出是文件buzz.elf
的完整反汇编。反汇编以.data部分开始,该部分通常不包含任何代码,因此文件以错误地反汇编为指令的数据开始。据推测,这看起来像垃圾。如果向下滚动到此文件中.text部分的开头,则应该反汇编代码以及链接到程序中的任何库代码。
如果要查看编译器的汇编输出,请尝试在include ~/lib/AVRmaster.mak
行之后添加这些行makefile:
%.ss: %.c
avr-gcc $(CFLAGS) -S $< -o $@
第二行的开头需要制表符。如果你削减&amp;将上面的内容粘贴到您的makefile中,您需要删除第二行开头的空格,并用制表符替换它们。
这将允许您使用命令make buzz.ss
生成一个名为buzz.ss
的文件,其中包含编译器生成的程序集。