Чередовать дизассемблирование + исходник с avr-objdump

У меня есть программа на C для attiny85, которую я хочу разобрать и отобразить с чередующимся исходным кодом.

Вот моя программа: test.c

#include <avr/io.h>
int main() {
    for(int i=0; i<100; i++) {
        PORTB=i;
    }
}

Вот как я это компилирую: avr-gcc -g -O0 -mmcu=attiny85 -o test.elf test.c

Наконец, я генерирую дизассемблированный код с чередующимся исходным кодом с помощью команды: avr-objdump -S -D test.elf

Дизассемблирование текстового раздела показывает следующее дизассемблирование без чередования исходного кода:

00000030 <main>:
  30:   cf 93           push    r28
  32:   df 93           push    r29
  34:   00 d0           rcall   .+0             ; 0x36 <main+0x6>
  36:   cd b7           in      r28, 0x3d       ; 61
  38:   de b7           in      r29, 0x3e       ; 62
  3a:   1a 82           std     Y+2, r1 ; 0x02
  3c:   19 82           std     Y+1, r1 ; 0x01
  3e:   0a c0           rjmp    .+20            ; 0x54 <__SREG__+0x15>
  40:   88 e3           ldi     r24, 0x38       ; 56
  42:   90 e0           ldi     r25, 0x00       ; 0
  44:   29 81           ldd     r18, Y+1        ; 0x01
  46:   fc 01           movw    r30, r24
  48:   20 83           st      Z, r18
  4a:   89 81           ldd     r24, Y+1        ; 0x01
  4c:   9a 81           ldd     r25, Y+2        ; 0x02
  4e:   01 96           adiw    r24, 0x01       ; 1
  50:   9a 83           std     Y+2, r25        ; 0x02
  52:   89 83           std     Y+1, r24        ; 0x01
  54:   89 81           ldd     r24, Y+1        ; 0x01
  56:   9a 81           ldd     r25, Y+2        ; 0x02
  58:   84 36           cpi     r24, 0x64       ; 100
  5a:   91 05           cpc     r25, r1
  5c:   8c f3           brlt    .-30            ; 0x40 <__SREG__+0x1>
  5e:   80 e0           ldi     r24, 0x00       ; 0
  60:   90 e0           ldi     r25, 0x00       ; 0
  62:   0f 90           pop     r0
  64:   0f 90           pop     r0
  66:   df 91           pop     r29
  68:   cf 91           pop     r28
  6a:   08 95           ret

Дизассемблирование имеет определенный смысл, но мне не хватает чередующегося исходного кода.

Интересно, что выходные данные также включают в себя фрагмент, где я также нахожу основной сегмент в разобранном виде:

#include <avr/io.h>

int main() {
  30:   20 00           .word   0x0020  ; ????
  32:   00 00           nop
  34:   80 00           .word   0x0080  ; ????
  36:   00 00           nop
  38:   00 00           nop
    for(int i=0; i<100; i++) {
  3a:   00 00           nop
  3c:   40 00           .word   0x0040  ; ????
  3e:   00 00           nop
        PORTB=i;
  40:   80 00           .word   0x0080  ; ????
  42:   00 00           nop
  44:   00 00           nop
  46:   00 00           nop
  48:   5a 00           .word   0x005a  ; ????
    for(int i=0; i<100; i++) {
  4a:   00 00           nop
  4c:   80 00           .word   0x0080  ; ????
  4e:   00 00           nop
  50:   00 00           nop
  52:   00 00           nop
  54:   91 00           .word   0x0091  ; ????
  56:   00 00           nop
  58:   80 00           .word   0x0080  ; ????
  5a:   00 00           nop
  5c:   00 00           nop
  5e:   00 00           nop
  60:   b7 00           .word   0x00b7  ; ????
    }

}

Теперь вывод включает исходный код, но дизассемблирование выполнено неправильно.

Как мне получить правильный вывод: дизассемблированные инструкции и чередующийся исходный код?

(avr-gcc (GCC) 9.3.0. Сборка чередования и исходный код для avr-objdump, похоже, не имеет проблемы, хотя он использует те же флаги компилятора...)

, 👍1


1 ответ


Лучший ответ:

3

Раздел .stabs содержит отладочную информацию, а не сам код. Здесь нет смысл в попытке "разобрать" его. Опция -D avr-objdump означает «разобрать все, верите ли вы, что это машина или нет». код". Не то, что вы хотите. Для ваших целей -S должно быть достаточно.

Я не знаю, почему ваш main() отображается без исходного кода. я попробовал ту же самую программу с точно такими же командами, и я вижу источник чередуется со сборкой. Я использую avr-gcc 5.4.0 и avr-objdump 2.26.20160125, поставляемый в Ubuntu Eoan.

,

Спасибо. Действительно, если я понизил компилятор до 5.4.0, он тоже работает. Я постараюсь определить версию, которая вызвала проблему, и сообщу об ошибке, как только смогу воспроизвести ее в чистой среде., @Dreamcooled