avr-objdump 使用 g++ -flto 产生不正确的输出
avr-objdump producing incorrect output with g++ -flto
我正在使用具有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的库存 Arduino IDE 1.8.4 对其进行编程,它随附 avr-objdump 2.26 和 avr-g++ 4.9.2.
我的程序或多或少能正常工作,但在尝试检查生成的程序集时,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 的调用,但我不知道要更改什么以显示正确的反汇编。
-flto
将 GCC 的内部表示放入 .o
,用于 link 时的跨文件优化。 https://gcc.gnu.org/wiki/LinkTimeOptimization
它不在代码段中,但您使用 -D
将非代码段分解为代码段。所以你得到了你想要的。
如果你没有使用 LTO,.o
中会有实际的 AVR 机器代码。
可以选择在 .o
中包含机器代码 和 gcc 内部表示,但这不会是最终的机器代码如果您在 linking 时使用 -flto
,则进入二进制文件。但更好的方法是使用 gcc -O3 -S
(另请参阅 )。 (没有 -flto
,否则你会看到 gcc
提供给 gas
的 asm 生成带有 .gnu.lto__Z13sleep...
部分的 .o
而不是 .text
部分。)
查看最终二进制代码的唯一方法是反汇编it。优化发生在创建它的同一步骤中,因此 none 前面的步骤保证是相同的。但是,查看编译器的 asm 输出可能很有用,因为它可以保留一些附加的符号信息,尤其是 -fverbose-asm
.
我正在使用具有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的库存 Arduino IDE 1.8.4 对其进行编程,它随附 avr-objdump 2.26 和 avr-g++ 4.9.2.
我的程序或多或少能正常工作,但在尝试检查生成的程序集时,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 的调用,但我不知道要更改什么以显示正确的反汇编。
-flto
将 GCC 的内部表示放入 .o
,用于 link 时的跨文件优化。 https://gcc.gnu.org/wiki/LinkTimeOptimization
它不在代码段中,但您使用 -D
将非代码段分解为代码段。所以你得到了你想要的。
如果你没有使用 LTO,.o
中会有实际的 AVR 机器代码。
可以选择在 .o
中包含机器代码 和 gcc 内部表示,但这不会是最终的机器代码如果您在 linking 时使用 -flto
,则进入二进制文件。但更好的方法是使用 gcc -O3 -S
(另请参阅 -flto
,否则你会看到 gcc
提供给 gas
的 asm 生成带有 .gnu.lto__Z13sleep...
部分的 .o
而不是 .text
部分。)
查看最终二进制代码的唯一方法是反汇编it。优化发生在创建它的同一步骤中,因此 none 前面的步骤保证是相同的。但是,查看编译器的 asm 输出可能很有用,因为它可以保留一些附加的符号信息,尤其是 -fverbose-asm
.