运行&#34时获取.elf文件而不是.s文件;制作buzz.s"

时间:2015-07-25 03:03:58

标签: assembly avr elf

我使用以下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源代码中对完全注释的程序进行反向工程。 我不确定我是否能够对所生产的产品进行逆向工程!

1 个答案:

答案 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的文件,其中包含编译器生成的程序集。