如何使用gdb调试原始二进制文件

时间:2014-03-04 16:38:46

标签: gdb arm

我有一个嵌入式设备的可执行文件 它没有gdb识别的头信息,而是使用供应商指定的专有头。

我可以使用IDA-pro分析文件,但是我想运行一些代码来查看它的功能。

可执行文件加载到地址0x52000000

但是如果我只是使用

加载文件
exec-file myfile

我得到了

  

“myfile”:不是可执行格式:无法识别文件格式

如果我使用以下方法将内存恢复到正确的位置:

restore myfile 52000000

我明白了:

  

如果没有调试过程,就无法做到这一点。

如何摆脱这种鸡蛋问题?

我只想跳到代码中间,将一些寄存器设置为预定值并运行一些代码以查看会发生什么。
请注意,我正在使用ARM自身的gdb ARM工具链。

1 个答案:

答案 0 :(得分:2)

根据@artless_noise建议,我做了以下事情:

objcopy.exe 
--output-target=elf32-bigarm 
--input-target=binary 
--change-start=0x52000000 
INPUTFILE OUTPUTFILE

这会在文件中添加elf标题 但它并不能解决整个问题

的输出
readelf.exe -a OUTPUTFILE 

给出:

ELF Header:
  Magic:   7f 45 4c 46 01 02 01 61 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, big endian
  Version:                           1 (current)
  OS/ABI:                            ARM
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x52000000
  Start of program headers:          0 (bytes into file)
  Start of section headers:          57316 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         5
  Section header string table index: 2

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .data             PROGBITS        00000000 000034 00df8c 00  WA  0   0  1
.....

请注意,.data部分的地址仍为0x00000000。这应该是0x52000000 为了解决这个问题,我在地址0xdf8c打开了一个十六进制编辑器 这与节标题的位置非常接近。 节标题的结构如下,以及我期望的数据。

typedef struct {
  Elf32_Word sh_name;    
  Elf32_Word sh_type;    = 1 {.data}
  Elf32_Word sh_flags;   = ?
  Elf32_Addr sh_addr;    = 0x00000000
  Elf32_Off sh_offset;   = 0x00000034
  Elf32_Word sh_size;    = 0x0000df8c
  Elf32_Word sh_link;
  Elf32_Word sh_info;
  Elf32_Word sh_addralign;
  Elf32_Word sh_entsize;
} Elf32_Shdr;

第一个标题始终为全零,第二个标题为.data部分。 所以我寻找神奇的数字并填写起始地址,保存文件并将其重新加载到gdb中。

现在可行