xtensa 反汇编中的大括号
Curly brackets in xtensa dissasembly
我正在拆解和检查(主要是为了娱乐和学习)为 ESP8266 (Xtensa ISA) 生成的 Arduino 代码。
到目前为止,我一直在遵循代码,直到主函数中的大括号(位置 4010f4c2
)出现问题:
4010f494 <main>:
4010f494: 90a092 movi a9, 144
4010f497: c01190 sub a1, a1, a9
4010f49a: 00a022 movi a2, 0
4010f49d: 236102 s32i a0, a1, 140
4010f4a0: 2261c2 s32i a12, a1, 136
4010f4a3: 2161d2 s32i a13, a1, 132
4010f4a6: ffc2c5 call0 4010f0d4 <print_version>
4010f4a9: 202110 or a2, a1, a1
4010f4ac: 001045 call0 4010f5b4 <eboot_command_read>
4010f4af: 00d256 bnez a2, 4010f4c0 <main+0x2c>
4010f4b2: 024c movi.n a2, 64
4010f4b4: fee101 l32r a0, 4010f038 <_stext+0x38>
4010f4b7: 0000c0 callx0 a0
4010f4ba: 1d0c movi.n a13, 1
4010f4bc: 000506 j 4010f4d4 <main+0x40>
4010f4bf: af2200 excw
4010f4c2: 2200a0d2016122ff { l32r a15, 400e794c <__udivsi3+0xd9730>; excw }
4010f4ca: d97ea0 excw
4010f4cd: da0121 l32r a2, 40105cd4 <__udivsi3+0xf7ab8>
4010f4d0: 9c0c11280000c0fe { excw; excw; srli a0, a12, 12 }
4010f4d8: 5a1266 bnei a2, 1, 4010f536 <main+0xa2>
4010f4db: feda21 l32r a2, 4010f044 <_stext+0x44>
4010f4de: fecc01 l32r a0, 4010f010 <_stext+0x10>
4010f4e1: 0000c0 callx0 a0
4010f4e4: fedd01 l32r a0, 4010f058 <_stext+0x58>
4010f4e7: 0000c0 callx0 a0
4010f4ea: 3138 l32i.n a3, a1, 12
4010f4ec: 4148 l32i.n a4, a1, 16
4010f4ee: 2128 l32i.n a2, a1, 8
4010f4f0: 050c movi.n a5, 0
4010f4f2: ffcec5 call0 4010f1e0 <copy_raw>
4010f4f5: 02cd mov.n a12, a2
4010f4f7: fed901 l32r a0, 4010f05c <_stext+0x5c>
4010f4fa: 0000c0 callx0 a0
4010f4fd: fed221 l32r a2, 4010f048 <_stext+0x48>
4010f500: 0c3d mov.n a3, a12
4010f502: fec301 l32r a0, 4010f010 <_stext+0x10>
4010f505: 0000c0 callx0 a0
4010f508: acec bnez.n a12, 4010f536 <main+0xa2>
4010f50a: f27c movi.n a2, -1
4010f50c: 1129 s32i.n a2, a1, 4
4010f50e: 3128 l32i.n a2, a1, 12
4010f510: 2129 s32i.n a2, a1, 8
4010f512: 2dec bnez.n a13, 4010f538 <main+0xa4>
4010f514: fece21 l32r a2, 4010f04c <_stext+0x4c>
4010f517: febe01 l32r a0, 4010f010 <_stext+0x10>
4010f51a: 0000c0 callx0 a0
4010f51d: 2128 l32i.n a2, a1, 8
4010f51f: ffbf05 call0 4010f110 <load_app_from_flash_raw>
4010f522: 02cd mov.n a12, a2
4010f524: 203220 or a3, a2, a2
4010f527: feca21 l32r a2, 4010f050 <_stext+0x50>
4010f52a: feb901 l32r a0, 4010f010 <_stext+0x10>
4010f52d: 0000c0 callx0 a0
4010f530: 0003c6 j 4010f543 <main+0xaf>
4010f533: 000000 ill
4010f536: 4d8c beqz.n a13, 4010f53e <main+0xaa>
4010f538: 201110 or a1, a1, a1
4010f53b: 000d05 call0 4010f60c <eboot_command_clear>
4010f53e: 1128 l32i.n a2, a1, 4
4010f540: d00226 beqi a2, -1, 4010f514 <main+0x80>
4010f543: 5c9c beqz.n a12, 4010f55c <main+0xc8>
4010f545: fec341 l32r a4, 4010f054 <_stext+0x54>
4010f548: f37c movi.n a3, -1
4010f54a: 0020c0 memw
4010f54d: 002422 l32i a2, a4, 0
4010f550: 013310 slli a3, a3, 31
4010f553: 202230 or a2, a2, a3
4010f556: 0020c0 memw
4010f559: 006422 s32i a2, a4, 0
4010f55c: ffff06 j 4010f55c <main+0xc8>
我之前看到过这个,但直到代码到达位置 4010f4af
并带有指向 4010f4c0
的分支指令,它正好位于大括号中间时,我才对此感到烦恼。当然即使这样,如果我尝试应用解析逻辑,在这个字节位置我得到 ffaf22
对应于有效指令 movi a2, 0xfff
.
这段代码属于eboot.elf
文件,我这样反汇编:
~/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/xtensa-lx106-elf/bin/objdump -d eboot.elf
你们知道为什么 objdump 会显示那些大括号吗?为什么它会像这样解释它们?我是否误解了 Xtensa 手册的一部分?我可能不是 运行 正确的命令吗?
非常感谢!
xtensa 汇编器和反汇编器对 VLIW-style(在 xtensa 世界中通常称为 FLIX)指令包使用花括号:一组操作码一起解码为一条指令并由处理器并行执行。例如,{ l32r a15, 400e794c <__udivsi3+0xd9730>; excw }
可能是 two-slot 指令,第一个槽中有 l32r
操作码,第二个槽中有 excw
操作码。
但是,如果您在不支持 FLIX 的 xtensa 内核的代码反汇编中看到它们(例如,lx106 不支持 FLIX),这通常意味着两件事:1) 反汇编程序配置不正确,以及 2) 它可能丢失了指令流正在反汇编数据或错误组成的指令字节。
在上面的示例中,可以看到指令 4010f4af: bnez a2, 4010f4c0 <main+0x2c>
直接跳到指令 4010f4bf: excw
的中间。这意味着在地址 0x4010f4bf 处有一个 non-instruction 字节,但反汇编程序没有意识到这一点。通常反汇编程序使用 .xt.prop
部分的内容来区分指令字节和 non-instruction 字节,这有助于它与指令流保持同步,但是当缺少该部分时,它会失去同步。
关于不正确的配置:当为特定的 xtensa 核心构建 binutils 时,需要用为该核心生成的 xtensa 配置覆盖的内容替换 binutils 源中的某些文件。它包含有关该内核的有效操作码、指令格式及其二进制表示的信息,汇编器和反汇编器使用它来仅接受和生成有效指令。在反汇编中出现核心不支持的指令格式是配置错误的明显标志。
过度使用 excw
是伪造反汇编的另一个明显迹象:因为 xtensa 覆盖生成器中的错误(修复了 xtensa 工具的 RG-2017.5 和 RG-2017.8 版本之间的某个地方)binutils当配置有错误工具生成的覆盖时,反汇编程序报告 excw
操作码而不是任何无法识别的操作码。
我正在拆解和检查(主要是为了娱乐和学习)为 ESP8266 (Xtensa ISA) 生成的 Arduino 代码。
到目前为止,我一直在遵循代码,直到主函数中的大括号(位置 4010f4c2
)出现问题:
4010f494 <main>:
4010f494: 90a092 movi a9, 144
4010f497: c01190 sub a1, a1, a9
4010f49a: 00a022 movi a2, 0
4010f49d: 236102 s32i a0, a1, 140
4010f4a0: 2261c2 s32i a12, a1, 136
4010f4a3: 2161d2 s32i a13, a1, 132
4010f4a6: ffc2c5 call0 4010f0d4 <print_version>
4010f4a9: 202110 or a2, a1, a1
4010f4ac: 001045 call0 4010f5b4 <eboot_command_read>
4010f4af: 00d256 bnez a2, 4010f4c0 <main+0x2c>
4010f4b2: 024c movi.n a2, 64
4010f4b4: fee101 l32r a0, 4010f038 <_stext+0x38>
4010f4b7: 0000c0 callx0 a0
4010f4ba: 1d0c movi.n a13, 1
4010f4bc: 000506 j 4010f4d4 <main+0x40>
4010f4bf: af2200 excw
4010f4c2: 2200a0d2016122ff { l32r a15, 400e794c <__udivsi3+0xd9730>; excw }
4010f4ca: d97ea0 excw
4010f4cd: da0121 l32r a2, 40105cd4 <__udivsi3+0xf7ab8>
4010f4d0: 9c0c11280000c0fe { excw; excw; srli a0, a12, 12 }
4010f4d8: 5a1266 bnei a2, 1, 4010f536 <main+0xa2>
4010f4db: feda21 l32r a2, 4010f044 <_stext+0x44>
4010f4de: fecc01 l32r a0, 4010f010 <_stext+0x10>
4010f4e1: 0000c0 callx0 a0
4010f4e4: fedd01 l32r a0, 4010f058 <_stext+0x58>
4010f4e7: 0000c0 callx0 a0
4010f4ea: 3138 l32i.n a3, a1, 12
4010f4ec: 4148 l32i.n a4, a1, 16
4010f4ee: 2128 l32i.n a2, a1, 8
4010f4f0: 050c movi.n a5, 0
4010f4f2: ffcec5 call0 4010f1e0 <copy_raw>
4010f4f5: 02cd mov.n a12, a2
4010f4f7: fed901 l32r a0, 4010f05c <_stext+0x5c>
4010f4fa: 0000c0 callx0 a0
4010f4fd: fed221 l32r a2, 4010f048 <_stext+0x48>
4010f500: 0c3d mov.n a3, a12
4010f502: fec301 l32r a0, 4010f010 <_stext+0x10>
4010f505: 0000c0 callx0 a0
4010f508: acec bnez.n a12, 4010f536 <main+0xa2>
4010f50a: f27c movi.n a2, -1
4010f50c: 1129 s32i.n a2, a1, 4
4010f50e: 3128 l32i.n a2, a1, 12
4010f510: 2129 s32i.n a2, a1, 8
4010f512: 2dec bnez.n a13, 4010f538 <main+0xa4>
4010f514: fece21 l32r a2, 4010f04c <_stext+0x4c>
4010f517: febe01 l32r a0, 4010f010 <_stext+0x10>
4010f51a: 0000c0 callx0 a0
4010f51d: 2128 l32i.n a2, a1, 8
4010f51f: ffbf05 call0 4010f110 <load_app_from_flash_raw>
4010f522: 02cd mov.n a12, a2
4010f524: 203220 or a3, a2, a2
4010f527: feca21 l32r a2, 4010f050 <_stext+0x50>
4010f52a: feb901 l32r a0, 4010f010 <_stext+0x10>
4010f52d: 0000c0 callx0 a0
4010f530: 0003c6 j 4010f543 <main+0xaf>
4010f533: 000000 ill
4010f536: 4d8c beqz.n a13, 4010f53e <main+0xaa>
4010f538: 201110 or a1, a1, a1
4010f53b: 000d05 call0 4010f60c <eboot_command_clear>
4010f53e: 1128 l32i.n a2, a1, 4
4010f540: d00226 beqi a2, -1, 4010f514 <main+0x80>
4010f543: 5c9c beqz.n a12, 4010f55c <main+0xc8>
4010f545: fec341 l32r a4, 4010f054 <_stext+0x54>
4010f548: f37c movi.n a3, -1
4010f54a: 0020c0 memw
4010f54d: 002422 l32i a2, a4, 0
4010f550: 013310 slli a3, a3, 31
4010f553: 202230 or a2, a2, a3
4010f556: 0020c0 memw
4010f559: 006422 s32i a2, a4, 0
4010f55c: ffff06 j 4010f55c <main+0xc8>
我之前看到过这个,但直到代码到达位置 4010f4af
并带有指向 4010f4c0
的分支指令,它正好位于大括号中间时,我才对此感到烦恼。当然即使这样,如果我尝试应用解析逻辑,在这个字节位置我得到 ffaf22
对应于有效指令 movi a2, 0xfff
.
这段代码属于eboot.elf
文件,我这样反汇编:
~/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/xtensa-lx106-elf/bin/objdump -d eboot.elf
你们知道为什么 objdump 会显示那些大括号吗?为什么它会像这样解释它们?我是否误解了 Xtensa 手册的一部分?我可能不是 运行 正确的命令吗?
非常感谢!
xtensa 汇编器和反汇编器对 VLIW-style(在 xtensa 世界中通常称为 FLIX)指令包使用花括号:一组操作码一起解码为一条指令并由处理器并行执行。例如,{ l32r a15, 400e794c <__udivsi3+0xd9730>; excw }
可能是 two-slot 指令,第一个槽中有 l32r
操作码,第二个槽中有 excw
操作码。
但是,如果您在不支持 FLIX 的 xtensa 内核的代码反汇编中看到它们(例如,lx106 不支持 FLIX),这通常意味着两件事:1) 反汇编程序配置不正确,以及 2) 它可能丢失了指令流正在反汇编数据或错误组成的指令字节。
在上面的示例中,可以看到指令 4010f4af: bnez a2, 4010f4c0 <main+0x2c>
直接跳到指令 4010f4bf: excw
的中间。这意味着在地址 0x4010f4bf 处有一个 non-instruction 字节,但反汇编程序没有意识到这一点。通常反汇编程序使用 .xt.prop
部分的内容来区分指令字节和 non-instruction 字节,这有助于它与指令流保持同步,但是当缺少该部分时,它会失去同步。
关于不正确的配置:当为特定的 xtensa 核心构建 binutils 时,需要用为该核心生成的 xtensa 配置覆盖的内容替换 binutils 源中的某些文件。它包含有关该内核的有效操作码、指令格式及其二进制表示的信息,汇编器和反汇编器使用它来仅接受和生成有效指令。在反汇编中出现核心不支持的指令格式是配置错误的明显标志。
过度使用 excw
是伪造反汇编的另一个明显迹象:因为 xtensa 覆盖生成器中的错误(修复了 xtensa 工具的 RG-2017.5 和 RG-2017.8 版本之间的某个地方)binutils当配置有错误工具生成的覆盖时,反汇编程序报告 excw
操作码而不是任何无法识别的操作码。