2017-09-01 3 views
3

J'ai une image de firmware binaire pour ARM Cortex M que je sais devrait être chargé à 0x20000000. Je voudrais le convertir en un format que je peux utiliser pour le débogage au niveau de l'assemblage avec gdb, ce qui, je suppose, signifie la conversion en .elf. Mais je n'ai pas été capable de comprendre comment ajouter suffisamment de métadonnées à l'aut. Pour que cela se produise. Voici ce que j'ai essayé jusqu'ici. Dois-je commencer par convertir le binaire en .o et écrire un script simple de l'éditeur de liens?Comment puis-je convertir un vidage de micrologiciel binaire en .elf pour le débogage du langage d'assemblage?

arm-none-eabi-objcopy -I binary -O elf32-littlearm --set-section-flags \ 
    .data=alloc,contents,load,readonly \ 
    --change-section-address .data=0x20000000 efr32.bin efr32.elf 

efr32.elf:  file format elf32-little 
efr32.elf 
architecture: UNKNOWN!, flags 0x00000010: 
HAS_SYMS 
start address 0x00000000 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .data   00000168 20000000 20000000 00000034 2**0 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
SYMBOL TABLE: 
20000000 l d .data 00000000 .data 
20000000 g  .data 00000000 _binary_efr32_bin_start 
20000168 g  .data 00000000 _binary_efr32_bin_end 
00000168 g  *ABS* 00000000 _binary_efr32_bin_size 

Dois-je ajouter une option d'architecture à la commande objcopy?

+1

il existe des moyens objcopy pour faire cela, mais vous avez besoin d'un ensemble d'instructions de longueur fixe, pouce sans thumb2 (bien que cela ne fonctionnera probablement pas avec gnu), bras sans pouce, mips 32 bits seulement (sans instructions 16 bits), pas x86 , pas un certain nombre d'autres. –

Répondre

3

Une petite expérience ...

58: 480a  ldr r0, [pc, #40] ; (84 <spi_write_byte+0x38>) 
    5a: bf08  it eq 
    5c: 4809  ldreq r0, [pc, #36] ; (84 <spi_write_byte+0x38>) 
    5e: f04f 01ff mov.w r1, #255 ; 0xff 

vous n'avez pas que bien sûr, mais vous pouvez lire le binaire et le faire avec elle:

.thumb 
.globl _start 
_start: 
.inst.n 0x480a 
.inst.n 0xbf08 
.inst.n 0x4809 
.inst.n 0xf04f 
.inst.n 0x01ff 

voir alors ce qui se passe.

arm-none-eabi-as test.s -o test.o 
arm-none-eabi-ld -Ttext=0x58 test.o -o test.elf 
arm-none-eabi-objdump -D test.elf 

test.elf:  file format elf32-littlearm 


Disassembly of section .text: 

00000058 <_start>: 
    58: 480a  ldr r0, [pc, #40] ; (84 <_start+0x2c>) 
    5a: bf08  it eq 
    5c: 4809  ldreq r0, [pc, #36] ; (84 <_start+0x2c>) 
    5e: f04f 01ff mov.w r1, #255 ; 0xff 

mais la réalité est-il coutume de travail ... si ce binaire a des extensions thumb2 isnt vont travailler, vous ne peux pas démonter les instructions de longueur variable linéaire. Vous devez traiter avec eux dans l'ordre d'exécution. Donc, pour le faire correctement, vous devez écrire un dissassembler qui marche à travers le code dans l'ordre d'exécution, déterminer les instructions que vous pouvez comprendre, les marquer comme instructions ...

80: d1e8  bne.n 54 <spi_write_byte+0x8> 
    82: bd70  pop {r4, r5, r6, pc} 
    84: 40005200 
    88: F7FF4000 
    8c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 
    90: 4887  ldr r0, [pc, #540] ; (2b0 <notmain+0x224>) 
.thumb 
.globl _start 
_start: 
.inst.n 0xd1e8 
.inst.n 0xbd70 
.inst.n 0x5200 
.inst.n 0x4000 
.inst.n 0x4000 
.inst.n 0xF7FF 
.inst.n 0xe92d 
.inst.n 0x41f0 
.inst.n 0x4887 

    80: d1e8  bne.n 54 <_start-0x2c> 
    82: bd70  pop {r4, r5, r6, pc} 
    84: 5200  strh r0, [r0, r0] 
    86: 4000  ands r0, r0 
    88: 4000  ands r0, r0 
    8a: f7ff e92d   ; <UNDEFINED> instruction: 0xf7ffe92d 
    8e: 41f0  rors r0, r6 
    90: 4887  ldr r0, [pc, #540] ; (2b0 <_start+0x230>) 

il récupérera, et de briser et de récupérer , etc.

à la place, vous devez écrire un désassembleur qui parcourt le code (il ne doit pas nécessairement être démonté en langage assembleur mais suffisamment pour parcourir le code et recopier tous les chemins possibles). toutes les données ne sont pas considérées comme des instructions marquent comme des instructions

.thumb 
.globl _start 
_start: 
.inst.n 0xd1e8 
.inst.n 0xbd70 
.word 0x40005200 
.word 0xF7FF4000 
.inst.n 0xe92d 
.inst.n 0x41f0 
.inst.n 0x4887 

00000080 <_start>: 
    80: d1e8  bne.n 54 <_start-0x2c> 
    82: bd70  pop {r4, r5, r6, pc} 
    84: 40005200 andmi r5, r0, r0, lsl #4 
    88: f7ff4000   ; <UNDEFINED> instruction: 0xf7ff4000 
    8c: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} 
    90: 4887  ldr r0, [pc, #540] ; (2b0 <_start+0x230>) 

et notre instruction stmdb est maintenant correcte.

bonne chance.

+0

quelles options objdump avez-vous utilisées pour afficher les lignes .inst.n? – joeforker

+0

ceux qui ont été créés à la main dans ce cas, vous écrivez un outil qui lit le binaire et crée un fichier comme ça. –

+0

note que j'ai démontré que même si je disais que c'était une instruction de pouce inst.n quand j'ai mis les extensions thumb2 là-bas au lieu d'un 32 bits inst.w comme deux 16 bit inst.n le désassembleur a compris qu'il s'agissait d'un pouce2. .. –