Eclipse CDT ELF Parser无法解析调试文件

时间:2016-08-01 12:34:55

标签: parsing elf eclipse-cdt objdump relocation

TL; DR

CDT ELF解析器和ObjDump无法解析我的可重定位文件,但两者都可以与可执行文件一起正常工作。我想知道他们是否有关系。

ObjDump有错误的缩写偏移,CDT解析器抛出 BufferUnderflowException

问题

我正在使用Eclipse CDT ELF Parser来从输出文件中提取变量信息。使用我的exectuble文件,它完美地运行。但是对于可重定位文件,它有阅读它的问题,但只有在某个点之后

编辑: 似乎缓冲区下溢并不是真正的问题,而是数据误解的结果。 还在测试看它是如何处理文件的。我稍后会发布

分析

起初我认为矮人部分必须被破坏。使用ObjDump,输出文件不完整,有几个错误。它实际上只显示类型,但错误的缩写编号和偏移

日志消息:

$ C:\ MinGW \ bin \ _ objdump.exe --dwarf%MYFILE%> %MYFILE%_objdump.txt

C:\MinGW\bin\objdump.exe: Warning: DIE at offset 0x1a9 refers to abbreviation number 8020 which does not exist
C:\MinGW\bin\objdump.exe: Warning: DIE at offset 0x1a9 refers to abbreviation number 8020 which does not exist
C:\MinGW\bin\objdump.exe: Warning: Unable to load/parse the .debug_info section, so cannot interpret the .debug_loc section.
C:\MinGW\bin\objdump.exe: Warning: Unable to load/parse the .debug_info section, so cannot interpret the .debug_ranges section.

然而,使用readelf,它可以完美地读取所有部分和符号。关于其他二进制文件,readelf和objdump输出是相同的。

在带有objdump的debug_info中我有例如:

Compilation Unit @ offset 0x170:
  Length:        0x7dc (32-bit)
  Version:       3
  Abbrev Offset: 0x0
  Pointer Size:  4

<0><17b>: Abbrev Number: 1 (DW_TAG_compile_unit)
   <17c>   DW_AT_producer    : (indirect string, offset: 0x0): object
   <180>   DW_AT_language    : 4    (C++)
   <181>   DW_AT_name        : (indirect string, offset: 0x0): object
   <185>   DW_AT_comp_dir    : (indirect string, offset: 0x0): object
   <189>   DW_AT_low_pc      : 0x0
   <18d>   DW_AT_high_pc     : 0x0
   <191>   DW_AT_stmt_list   : 0x0

<1><195>: Abbrev Number: 2 (DW_TAG_subprogram)
   <196>   DW_AT_name        : (indirect string, offset: 0x704): OK
   <19a>   DW_AT_decl_file   : 0
   <19b>   DW_AT_decl_line   : 0
   <19c>   DW_AT_low_pc      : 0x69050403
   <1a0>   DW_AT_high_pc     : 0x400746e
   <1a4>   DW_AT_frame_base  : 0 byte block:    ()
   <1a5>   DW_AT_sibling     : <0x2000170>
<2><1a9>: Abbrev Number: 8020

与readelf一起

Compilation Unit @ offset 0x170:
  Length:        0x7dc (32-bit)
  Version:       3
  Abbrev Offset: 0xdb
  Pointer Size:  4

<0><17b>: Abbrev Number: 1 (DW_TAG_compile_unit)   
   <17c>   DW_AT_producer    : (indirect string, offset: 0x3c1): GNU C++ 4.8.1 -mlittle-endian -march=armv7-a -mfpu=vfp -mfloat-abi=softfp -mapcs-frame -mlong-calls -gdwarf-3 -ansi -fno-zero-initialized-in-bss    
   <180>   DW_AT_language    : 4    (C++)
   <181>   DW_AT_name        : (indirect string, offset: 0x192): C:/[...]
   <185>   DW_AT_comp_dir    : (indirect string, offset: 0x452): C:\[...]
   <189>   DW_AT_low_pc      : 0x50
   <18d>   DW_AT_high_pc     : 0x204
   <191>   DW_AT_stmt_list   : 0x4d

<1><195>: Abbrev Number: 2 (DW_TAG_base_type)
   <196>   DW_AT_byte_size   : 4
   <197>   DW_AT_encoding    : 7    (unsigned)
   <198>   DW_AT_name        : (indirect string, offset: 0x2a0): long unsigned int
<1><19c>: Abbrev Number: 3 (DW_TAG_base_type)

在第二个编译单元中,ObjDump没有更改缩写Offset ,因此它使用了第一个编译单元中的缩写编号。这意味着它将下一个值解释为不同类型的属性 - 它应该是基本类型,它作为子程序读取。

另一个重要的事实是这个固件具有动态分配,不像所有其他工作。

ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              REL (Relocatable file)
Machine:                           ARM
Version:                           0x1
Entry point address:               0x0
Start of program headers:          0 (bytes into file)
Start of section headers:          18150404 (bytes into file)
Flags:                             0x5000000, Version5 EABI
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:         1636
Section header string table index: 1633

我知道“objdump通过BFD过滤器看到一个ELF文件”而“readelf程序没有链接到BFD库”。但是,我找不到这个与CDT ELF解析器之间的任何关系,尽管问题指向了这个方向。

问题

嗯,这是一个非常密集的问题,有一件事与另一件事有关,所以我有很多问题。但随意回答一个或一半。或者甚至给我一些关于测试内容的想法。

  • 这是什么以及为什么会发生?
  • 不能ObjDump解析重定位(如果有问题)?
  • ObjDump和CDT是否有共同的库(可能来自gcc)?
  • readelf如何解析它的文件?是否有可能复制它?

修改

因为它只有我的一个elf文件和一个非常复杂的固件,所以很难将它复制到 Minimal, Complete, and Verifiable example 中。但如果你知道如何提供更多信息,请告诉我。

0 个答案:

没有答案