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解析器之间的任何关系,尽管问题指向了这个方向。
问题
嗯,这是一个非常密集的问题,有一件事与另一件事有关,所以我有很多问题。但随意回答一个或一半。或者甚至给我一些关于测试内容的想法。
修改
因为它只有我的一个elf文件和一个非常复杂的固件,所以很难将它复制到 Minimal, Complete, and Verifiable example 中。但如果你知道如何提供更多信息,请告诉我。