2017-09-23 20 views
0

AVR Atmega2560 칩이있는 Arduino Mega 2560을 사용하고 있습니다. Windows에서 avdu-objdump 2.26 및 avr-g ++ 4.9.2와 함께 제공되는 Arduino IDE 1.8.4를 사용하여 프로그래밍하고 있습니다.g ++로 잘못된 출력을 생성하는 avr-objdump -flto

내 프로그램은 다소 효과가 있지만 생성 된 어셈블리를 검사 할 때 objdump가 올바른 출력을 생성하지 못하는 것처럼 보입니다.

avr-objdump -D -S -m avr:6 "arduino_build_948544\sketch\mysketch.ino.cpp.o" > mysketch.asm 

가 성공한 것처럼 실행

,하지만

void sleep_example() { 
    SMCR = 1; 
    __asm__("sleep"); 
} 

만큼 간단한 함수의 분해는 기본적으로 무작위로 나타납니다

Disassembly of section .gnu.lto__Z13sleep_examplev.af7e500a: 

00000000 <.gnu.lto__Z13sleep_examplev.af7e500a>: 
    0: 78 9c   mul r7, r8 
    2: 63 66   ori r22, 0x63 ; 99 
    4: c0 04   cpc r12, r0 
    6: 52 40   sbci r21, 0x02 ; 2 
    8: fc 18   sub r15, r12 
    a: 88 3d   cpi r24, 0xD8 ; 216 
    c: 81 98   cbi 0x10, 1 ; 16 
    e: 91 99   sbic 0x12, 1 ; 18 
    10: 81 91   ld r24, Z+ 
    12: 69 c2   rjmp .+1234  ; 0x4e6 <__SREG__+0x4a7> 
    14: 39 06   cpc r3, r25 
    16: 86 46   sbci r24, 0x66 ; 102 
    18: 0e 26   eor r0, r30 
    1a: 46 46   sbci r20, 0x66 ; 102 
    1c: 10 83   st Z, r17 
    1e: 81 91   ld r24, Z+ 
    20: a1 9e   mul r10, r17 
    22: 89 b1   in r24, 0x09 ; 9 
    24: 9e f1   brts .+102  ; 0x8c <__SREG__+0x4d> 
    26: 25 d3   rcall .+1610  ; 0x672 <__SREG__+0x633> 
    28: 47 26   eor r4, r23 
    2a: c6 ef   ldi r28, 0xF6 ; 246 
    2c: 73 17   cp r23, r19 
    2e: 9c 60   ori r25, 0x0C ; 12 
    30: 52 57   subi r21, 0x72 ; 114 
    32: 9d fe   .word 0xfe9d ; ???? 
    34: ba 99   sbic 0x17, 2 ; 23 
    36: bb a1   ldd r27, Y+35 ; 0x23 
    38: cb e0   ldi r28, 0x0B ; 11 
    3a: 27 13   cpse r18, r23 
    3c: 03 c3   rjmp .+1542  ; 0x644 <__SREG__+0x605> 
    3e: 67 26   eor r6, r23 
    40: 88 21   and r24, r8 
    42: 8c cb   rjmp .-2280  ; 0xfffff75c <__SREG__+0xfffff71d> 
    44: 19 d5   rcall .+2610  ; 0xa78 <__SREG__+0xa39> 
    46: 19 80   ldd r1, Y+1 ; 0x01 
    48: 2a 3a   cpi r18, 0xAA ; 170 
    4a: 77 dc   rcall .-1810  ; 0xfffff93a <__SREG__+0xfffff8fb> 
    4c: ee e0   ldi r30, 0x0E ; 14 
    4e: 63 63   ori r22, 0x33 ; 51 
    50: 61 84   ldd r6, Z+9 ; 0x09 
    52: 48 30   cpi r20, 0x08 ; 8 
    54: ae 60   ori r26, 0x0E ; 14 
    56: 64 63   ori r22, 0x34 ; 52 
    58: 04 d2   rcall .+1032  ; 0x462 <__SREG__+0x423> 
    5a: eb 85   ldd r30, Y+11 ; 0x0b 
    5c: 0e 34   cpi r16, 0x4E ; 78 
    5e: fc ff   .word 0xfffc ; ???? 
    60: cf bc   out 0x2f, r12 ; 47 
    62: eb e1   ldi r30, 0x1B ; 27 
    64: 3b 65   ori r19, 0x5B ; 91 
    66: 66 06   cpc r6, r22 
    68: 86 27   eor r24, r22 
    6a: 40 29   or r20, r0 
    6c: 90 d1   rcall .+800  ; 0x38e <__SREG__+0x34f> 
    6e: 4f 99   sbic 0x09, 7 ; 9 
    70: 98 40   sbci r25, 0x08 ; 8 
    72: 34 f3   brlt .-52  ; 0x40 <__SREG__+0x1> 
    74: 2d c6   rjmp .+3162  ; 0xcd0 <__SREG__+0xc91> 
    76: 43 1f   adc r20, r19 
    78: 36 7c   andi r19, 0xC6 ; 198 
    7a: 63 94   inc r6 
    7c: 05 a9   ldd r16, Z+53 ; 0x35 
    7e: 06 1a   sub r0, r22 
    80: 31 67   ori r19, 0x71 ; 113 
    82: 75 fb   bst r23, 5 
    84: 19 de   rcall .-974  ; 0xfffffcb8 <__SREG__+0xfffffc79> 
    86: 17 4c   sbci r17, 0xC7 ; 199 
    88: 3f 99   sbic 0x07, 7 ; 7 
    8a: 18 83   st Y, r17 
    8c: 41 26   eor r4, r17 
    8e: ee ea   ldi r30, 0xAE ; 174 
    90: fb 7f   andi r31, 0xFB ; 251 
    92: 90 0b   sbc r25, r16 
    94: cc 65   ori r28, 0x5C ; 92 
    96: 00 71   andi r16, 0x10 ; 16 
    98: 37 ed   ldi r19, 0xD7 ; 215 
    9a: 5e 74   andi r21, 0x4E ; 78 
    9c: 9c 79   andi r25, 0x9C ; 156 
    9e: 2e e3   ldi r18, 0x3E ; 62 
    a0: ec c6   rjmp .+3544  ; 0xe7a <__SREG__+0xe3b> 
    a2: 16 46   sbci r17, 0x66 ; 102 
    a4: 86 9f   mul r24, r22 
    a6: 4c 4c   sbci r20, 0xCC ; 204 
    a8: 8c 2b   or r24, r28 
    aa: 19 a5   ldd r17, Y+41 ; 0x29 
    ac: 18 57   subi r17, 0x78 ; 120 
    ae: 31 02   muls r19, r17 
    b0: fd c0   rjmp .+506  ; 0x2ac <__SREG__+0x26d> 
    b2: b8 9a   sbi 0x17, 0 ; 23 
    b4: 71 2e   mov r7, r17 
    b6: 23 50   subi r18, 0x03 ; 3 
    b8: c1 a7   std Z+41, r28 ; 0x29 
    ba: 27 37   cpi r18, 0x77 ; 119 
    bc: 7f b2   in r7, 0x1f ; 31 
    be: 83 d4   rcall .+2310  ; 0x9c6 <__SREG__+0x987> 
    c0: 33 33   cpi r19, 0x33 ; 51 
    c2: 32 30   cpi r19, 0x02 ; 2 
    c4: ae 01   movw r20, r28 
    c6: ca dc   rcall .-1644  ; 0xfffffa5c <__SREG__+0xfffffa1d> 
    c8: 66 6c   ori r22, 0xC6 ; 198 
    ca: 38 7c   andi r19, 0xC8 ; 200 
    cc: fb 38   cpi r31, 0x8B ; 139 
    ce: 1b 13   cpse r17, r27 
    d0: c8 78   andi r28, 0x88 ; 136 
    d2: 90 53   subi r25, 0x30 ; 48 
    d4: 9d 19   sub r25, r13 
    d6: ee 31   cpi r30, 0x1E ; 30 
    d8: 36 1e   adc r3, r22 
    da: b8 eb   ldi r27, 0xB8 ; 184 
    dc: 0e e3   ldi r16, 0x3E ; 62 
    de: 3f 01   movw r6, r30 
    e0: 9a 0c   add r9, r10 
    e2: 74 06   cpc r7, r20 
    e4: d0 51   subi r29, 0x10 ; 16 
    e6: 0e ce   rjmp .-996  ; 0xfffffd04 <__SREG__+0xfffffcc5> 
    e8: 56 31   cpi r21, 0x16 ; 22 
    ea: a1 c5   rjmp .+2882  ; 0xc2e <__SREG__+0xbef> 
    ec: a9 45   sbci r26, 0x59 ; 89 
    ee: c5 31   cpi r28, 0x15 ; 21 
    f0: e9 25   eor r30, r9 
    f2: f9 f9   .word 0xf9f9 ; ???? 
    f4: b9 31   cpi r27, 0x19 ; 25 
    f6: fe 79   andi r31, 0x9E ; 158 
    f8: a9 2e   mov r10, r25 
    fa: 45 99   sbic 0x08, 5 ; 8 
    fc: 65 a9   ldd r22, Z+53 ; 0x35 
    fe: 31 2e   mov r3, r17 
100: f9 c9   rjmp .-3086  ; 0xfffff4f4 <__SREG__+0xfffff4b5> 
102: a5 b9   out 0x05, r26 ; 5 
104: a9 79   andi r26, 0x99 ; 153 
106: 25 c5   rjmp .+2634  ; 0xb52 <__SREG__+0xb13> 
108: 31 8e   std Z+25, r3 ; 0x19 
10a: 45 29   or r20, r5 
10c: a5 99   sbic 0x14, 5 ; 20 
10e: 79 f9   .word 0xf979 ; ???? 
110: 31 c9   rjmp .-3486  ; 0xfffff374 <__SREG__+0xfffff335> 
112: 89 05   cpc r24, r9 
114: b9 a9   ldd r27, Y+49 ; 0x31 
116: 25 a9   ldd r18, Z+53 ; 0x35 
118: 45 70   andi r20, 0x05 ; 5 
11a: 86 1e   adc r8, r22 
11c: 50 94   com r5 
11e: 81 ad   ldd r24, Z+57 ; 0x39 
120: 38 27   eor r19, r24 
122: 35 b5   in r19, 0x25 ; 37 
124: 80 01   movw r16, r0 
126: 00 1d   adc r16, r0 
128: 9f 69   ori r25, 0x9F ; 159 
12a: 9f f5   Address 0x0000012a is out of bounds. 
.word 0xffff ; ???? 

잘 모르겠어요 왜 이래? 아마도 avr-objdump를 호출했을 것입니다.하지만 정확한 디스 어셈블리를 보여주기 위해 무엇을 변경해야할지 모르겠습니다.

+0

링크 타임 최적화 (LTO)를 설정하지 않으면 링크 타임까지 코드가 컴파일되지 않습니다. –

+0

@RossRidge 컴파일 단계와 링크 단계에서 '-flto'가 모두 전달되었음을 확인할 수 있습니다. IDE에서 제어 할 수는 없지만 IDE 없이도 사용자 정의 컴파일을 수행하고 objdump를 시도 할 수 있습니다. 그러나 그것이 왜 중요할까요? 이 출력이 왜 왜곡되어 있습니까? – Reinderien

+2

내가 말했듯이 아직 컴파일되지 않았기 때문에. C에서 기계어 코드로 변환되지 않고 대신 C에서 GCC에서 사용되는 내부 중간 형식으로 변환되었습니다. 링크 단계까지 분해 할 수있는 기계 코드로 변환되지 않습니다. GCC에서 어셈블리 출력을보고 싶다면'-flto' 옵션없이'-S' 옵션을 사용하면 GCC는 객체 파일 대신 어셈블리 파일을 생성 할 것을 제안합니다. –

답변

4

-flto은 링크 시간에 교차 파일 최적화를 위해 GCC의 내부 표현을 .o에 넣습니다. https://gcc.gnu.org/wiki/LinkTimeOptimization

코드 섹션에는 없지만 -D을 사용하여 비 코드 섹션을 코드 인 것처럼 분해합니다. 그래서 당신은 당신이 요구 한 것을 정확하게 얻었습니다.

LTO를 사용하지 않았다면 실제 AVR 기계 코드가 .o에 있습니다.

기계 코드 .o에서 GCC 내부 표현을 포함 할 수있는 옵션이있을 수 있습니다,하지만 연결하는 동안 -flto를 사용하는 경우 바이너리로 전환됩니다 최종 기계 코드되지 않습니다. 하지만 더 좋은 방법은 gcc -O3 -S입니다 (How to remove "noise" from GCC/clang assembly output? 참조). (-flto하지 않고, 그렇지 않으면 당신은 gccgas에 공급하는 ASM 대신 .text 섹션의 .gnu.lto__Z13sleep... 섹션으로 .o을 생산하기 위해 볼 수 있습니다.)

유일한 방법은 최종 바이너리 코드를 보는 것은 분해하는 것입니다 . 최적화는이를 생성하는 동일한 단계에서 발생하므로 이전 단계 중 어느 것도 동일하게 보장되지 않습니다. 그러나 컴파일러의 asm 출력을 보면 유용한 기호 정보를 유지할 수 있으므로 특히 유용합니다 (특히 -fverbose-asm).

+0

사실 : 나는 최종 엘프의 obj 덤프가 최상의 결과를 산출한다는 것을 알았습니다. 불행히도'gcc -S'는 유용하지 않습니다. 디스어셈을 명령으로 보여주기보다는 오히려 불투명 한 텍스트 섹션 블록으로 헥스를 다시 보여줍니다. – Reinderien

+2

@Reinderien :'gcc -O3 -S -flto'를 사용 했습니까? 로스가 너에게 말한 것처럼? asm 출력은'.text' 섹션 대신'.gnu.lto__Z13sleep _... '섹션을 포함하는'.o'파일을 만드는 방법입니다. –

+0

아, 그래 ... 나는 LTO를 제거하고 -S를 추가하려했지만 함께하지는 못했습니다. 그랬어. – Reinderien