atmegaavr-gccobjdump

How To Disassemble A atmega328p Elf File


I tried to disas atmega328p elf files like this.

 avr-objdump -d -Maddr16,data16 target/avr-atmega328p/release/sample.elf                                                                                            (git)-[serial_echo_interrupt]

target/avr-atmega328p/release/sample.elf:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
   0:   0c 94 34 00     jmp     0x68    ; 0x68 <__ctors_end>
   4:   0c 94 51 00     jmp     0xa2    ; 0xa2 <__bad_interrupt>
   8:   0c 94 51 00     jmp     0xa2    ; 0xa2 <__bad_interrupt>
   c:   0c 94 51 00     jmp     0xa2    ; 0xa2 <__bad_interrupt>
  10:   0c 94 51 00     jmp     0xa2    ; 0xa2 <__bad_interrupt>

but the program address is mismatch because the flash width is 16 bit.

Do you know how to set 16-bit flash width?


Solution

  • the program address is mismatch because the flash width is 16 bit.

    Do you know how to set 16-bit flash width?

    GNU tools are using byte addresses, and there is no way to change that. This applies to:

    The only exception is when you are taking the address of a function in C/C++ which will be a word-address suitable for an indirect call via icall.

    As an aside, specifying an emulation like with objdump -m avr5 as proposed in the other answer won't change this in any way. You are disassembling an ELF file which knows the emulation anyways (as opposed to Intel HEX format which is agnostic).