gcc: xtensa LX106 (ESP8266) отсутствует имена символов из исполняемого файла ELF - PullRequest
0 голосов
/ 07 февраля 2019

У меня проблема с gcc (5.2.0) для процессора Xtensa LX106 (ESP8266), который, по-видимому, пропускает некоторые имена символов в исполняемом файле (ELF), пока они существуют в * .map файле, и я пытаюсь понять, почему.

Это часть * .map файла

*fill*         0x4021487b        0x0 
 *fill*         0x4021487b        0x0 
 *fill*         0x4021487b        0x1 
 .text.inc_byte_array
                0x4021487c       0x1d W:\sensor_ovi\sw\sensor\app\esp8266\lib300\libwpa.a(common.o)
                0x4021487c                inc_byte_array
 *fill*         0x40214899        0x3 
 .text.hex2num  0x4021489c       0x33 W:\sensor_ovi\sw\sensor\app\esp8266\lib300\libwpa.a(common.o)
 *fill*         0x402148cf        0x0 
 *fill*         0x402148cf        0x0 
 *fill*         0x402148cf        0x0 
 *fill*         0x402148cf        0x1 
 .text.os_get_time
                0x402148d0        0x4 W:\sensor_ovi\sw\sensor\app\esp8266\lib300\libwpa.a(os_xtensa.o)
                0x402148d0                os_get_time
 *fill*         0x402148d4        0x0 
 *fill*         0x402148d4        0x0 
 *fill*         0x402148d4        0x0 

Как видите, нет никакой разницы между inc_byte_array () и hex2num (), обе функции связываются, поскольку они используются.

Но objdump не может найти символ hex2num (), он полностью отсутствует.Как следствие, сброшенная сборка неверна:

4021487c <inc_byte_array>:
inc_byte_array():
4021487c:   530b                    addi.n  a5, a3, -1
4021487e:   1513a6                  blti    a3, 1, 40214897 <inc_byte_array+0x1b>
40214881:   352a                    add.n   a3, a5, a2
40214883:   220b                    addi.n  a2, a2, -1
40214885:   000342                  l8ui    a4, a3, 0
40214888:   441b                    addi.n  a4, a4, 1
4021488a:   744040                  extui   a4, a4, 0, 8
4021488d:   004342                  s8i a4, a3, 0
40214890:   34cc                    bnez.n  a4, 40214897 <inc_byte_array+0x1b>
40214892:   330b                    addi.n  a3, a3, -1
40214894:   ed9327                  bne a3, a2, 40214885 <inc_byte_array+0x9>
40214897:   f00d                    ret.n

// здесь останавливается inc_byte_array ()

40214899:   000000                  ill

// здесь идет заполнение компоновщика fill 0x40214899 0x3

// и здесь запускается hex2num (), но в ELF отсутствует символ: (

4021489c:   f32c                    movi.n  a3, 47
4021489e:   09b327                  bgeu    a3, a2, 402148ab <inc_byte_array+0x2f>
402148a1:   943c                    movi.n  a4, 57
402148a3:   043427                  bltu    a4, a2, 402148ab <inc_byte_array+0x2f>
402148a6:   d0c222                  addi    a2, a2, -48
402148a9:   f00d                    ret.n
402148ab:   60a052                  movi    a5, 96
402148ae:   0ab527                  bgeu    a5, a2, 402148bc <inc_byte_array+0x40>
402148b1:   66a062                  movi    a6, 102
402148b4:   043627                  bltu    a6, a2, 402148bc <inc_byte_array+0x40>
402148b7:   a9c222                  addi    a2, a2, -87
402148ba:   f00d                    ret.n
402148bc:   074c                    movi.n  a7, 64
402148be:   09b727                  bgeu    a7, a2, 402148cb <inc_byte_array+0x4f>
402148c1:   684c                    movi.n  a8, 70
402148c3:   043827                  bltu    a8, a2, 402148cb <inc_byte_array+0x4f>
402148c6:   c9c222                  addi    a2, a2, -55
402148c9:   f00d                    ret.n
402148cb:   f27c                    movi.n  a2, -1
402148cd:   f00d                    ret.n
402148cf:   020c00                  andb    b0, b12, b0 

Теперь это был простой пример, вызывать hex2num () прямо. Но есть ситуациичто ASM-дамп полностью ошибочен, поскольку, поскольку символ отсутствует, objdump просто связывается с литералами, которые были сброшены перед функцией (Xtensa LX106 аналогичен Cortex M0)

Более того, даже * .map в некоторых случаях неверен, так какНапример:

libwpa.a :(. literal. .text. *) .text.hostapd_derive_psk 0x40210000 0x56 W: \ sensor_ovi \ sw \ sensor \ app \ esp8266 \ lib300 \ libwpa.a (ap_config.o) fill 0x40210056 0x2 .text.hostapd_setup_wpa_psk 0x40210058 0x31 W: \ sensor_ovi \ sw \ sensor \ app \ esp8266 \ lib300 \ libwpa.a (ap_config.o) 0x35 (размер) 0x40210058 hostapd_setup_wpa_psk

Итак, мы должны найтиhostapd_derive_psk () в 40210000, размер 0x56, затем заполнение 2 байтами, затем hostapd_setup_wpa_psk () в 0x40210058

Это то, что было сброшено objdump:

40210000 <hostapd_setup_wpa_psk-0x58>:

// отсутствует полностью hostapdkri (символ) hostapdkri40210000: 241630 extui a1, a3, 6, 3 40210003: df6540 excw 40210006: 2ac840100e583ffe {excw;extui a0, a0, 0, 2;add a12, a10, a8} 4021000e: b44000 extui a4, a0, 0, 12 40210011: 0018 l32i.n a1, a0, 0 40210013: fb3140 excw 40210016: ff .byte 0xff 40210017: 22a142 movi a4, 0x122 40211di: fa1, a1, -16 4021001d: 11c9 s32i.n a12, a1, 4 4021001f: 0109 s32i.n a0, a1, 0 40210021: 02cd mov.n a12, a2 ​​40210023: 023c movi.n a2, 48 40210025: fff801 l32ra0, 40210008 <_irom0_text_start + 0x8> 40210028: 0000c0 callx0 a0 4021002b: ac29 s32i.n a2, a12, 40 4021002d: 32 куб.000606 J 4021004d <_irom0_text_start + 0x4d> 40210034: bc28 l32i.n а2, а12, 44 40210036: fff501 l32r а0, 4021000c <_irom0_text_start + 0xc> 40210039: 0000c0 callx0 а0 4021003c: fff231 l32r а3, 40210004 <_irom0_text_start + 0x4> 4021003f:ac28 l32i.n a2, a12, 40 40210041: 042c movi.n a4, 32 40210043: 228b addi.n a2, a2, 8 40210045: fff201 l32r a0, 40210010 <_irom0_text_start + 0x10> 40210048: 0000c0 callx0 a0.n a2, 0 4021004d: 11c8 l32i.n a12,a1, 4 4021004f: ​​0108 l32i.n a0, a1, 0 40210051: 10c112 addi a1, a1, 16 40210054: f00d ret.n 40210056: 120000 andbc b0, b0, b0

40210058 <hostapd_setup_wpa_psk>:
hostapd_setup_wpa_psk():

// ПРАВИЛЬНО 40210058: f0c112 addi a1, a1, -16 4021005b: 016102 s32i a0, a1, 4 4021005e: 0f2202 l32i a0, a2, 60 40210061: 01b016 beqz a0, 40210080 40210064:a0, a2, 56 40210066: 0129 s32i.n a2, a1, 0 40210068: 00dc bnez.n a0, 4021007c 4021006a: 10c222 addi a2, a2, 16 4021006d: fffa45 call0 40210014

// Ossss ..у нас есть вызов 40210014, который не указан нигде, даже в * .map !!!

<_ irom0_text_start + 0x14> 40210070: 0042d6 bgez a2, 40210078 ...

Итак, давайтедамп вручную для правильного кода

xtensa-lx106-elf-objdump -dz --start-address = 0x40210014 --stop-address = 0x40210057 sensor.elf> sensor.txt

Как вы можетевидите, это правильный сброшенный ассемблерный код

40210014:   fffb31                  l32r    a3, 40210000 <_irom0_text_start>
40210017:   22a142                  movi    a4, 0x122
4021001a:   f0c112                  addi    a1, a1, -16
4021001d:   11c9                    s32i.n  a12, a1, 4
4021001f:   0109                    s32i.n  a0, a1, 0
40210021:   02cd                    mov.n   a12, a2
40210023:   023c                    movi.n  a2, 48
40210025:   fff801                  l32r    a0, 40210008 <_irom0_text_start+0x8>
40210028:   0000c0                  callx0  a0
4021002b:   ac29                    s32i.n  a2, a12, 40
4021002d:   32cc                    bnez.n  a2, 40210034 <_irom0_text_start+0x34>
4021002f:   f27c                    movi.n  a2, -1
40210031:   000606                  j   4021004d <_irom0_text_start+0x4d>
40210034:   bc28                    l32i.n  a2, a12, 44
40210036:   fff501                  l32r    a0, 4021000c <_irom0_text_start+0xc>
40210039:   0000c0                  callx0  a0
4021003c:   fff231                  l32r    a3, 40210004 <_irom0_text_start+0x4>
4021003f:   ac28                    l32i.n  a2, a12, 40
40210041:   042c                    movi.n  a4, 32
40210043:   228b                    addi.n  a2, a2, 8
40210045:   fff201                  l32r    a0, 40210010 <_irom0_text_start+0x10>
40210048:   0000c0                  callx0  a0
4021004b:   020c                    movi.n  a2, 0
4021004d:   11c8                    l32i.n  a12, a1, 4
4021004f:   0108                    l32i.n  a0, a1, 0
40210051:   10c112                  addi    a1, a1, 16
40210054:   f00d                    ret.n
40210056:   120000                  andbc   b0, b0, b0

Итак, вернемся к первоначальному вопросу, почему символы gcc strip, которые есть в * .map файле?

Спасибо за разъяснения,

...