我正在使用ARM-GCC 4.7.4为Cortex-M4编译代码。对于我们的调试工具,我需要以人类可读的格式(例如.txt)了解所有变量的名称、类型和地址。映射文件提供了大部分信息,不幸的是,下面的结构内容不是这样的:
typedef struct { float32_t Ref; // Input: Reference Value
float32_t Fdb; // Variable: Feedback Value
float32_t Err; // Input: Control Error
float32_t Kp; // Parameter: Gain of the Proportional Part
float32_t Up; // Output: Output of Proportional Part
float32_t Ki; // Parameter: Gain of the Integral Part
float32_t Ui; // Output: Output of the Integral Part
float32_t OutPreSat; // Output: Not saturated Output
float32_t OutMax; // Parameter: Maximum Output
float32_t OutMin; // Parameter: Minimum Output
float32_t Out; // Output: Saturated Output
} PI_REG;
PI_REG BU_Uctrl_Udc_PI_Reg = BU_UCTRL_UDC_PI_REG_INIT;因此,我尝试使用工具nm、readelf和objdump从以dwarf-2格式使用参数-g3编译的.elf文件中获取一些信息。只有使用objdump我才能找到我搜索的信息:
objdump –Wi myfile.elf >symbols.txt在symbols.txt文件中可以找到以下关于类型定义PI_REG的信息:
<1><38883>: Abbrev Number: 2 (DW_TAG_base_type)
<38884> DW_AT_byte_size : 4
<38885> DW_AT_encoding : 4 (float)
<38886> DW_AT_name : (indirect string, offset: 0x2c63e): float
<1><38891>: Abbrev Number: 11 (DW_TAG_typedef)
<38892> DW_AT_name : (indirect string, offset: 0xb336d): float32_t
<38896> DW_AT_decl_file : 4
<38897> DW_AT_decl_line : 370
<38899> DW_AT_type : <0x38883>
<1><390d7>: Abbrev Number: 14 (DW_TAG_structure_type)
<390d8> DW_AT_byte_size : 44
<390d9> DW_AT_decl_file : 6
<390da> DW_AT_decl_line : 26
<390db> DW_AT_sibling : <0x39176>
<2><390df>: Abbrev Number: 16 (DW_TAG_member)
<390e0> DW_AT_name : Ref
<390e4> DW_AT_decl_file : 6
<390e5> DW_AT_decl_line : 26
<390e6> DW_AT_type : <0x38891>
<390ea> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<2><390ed>: Abbrev Number: 16 (DW_TAG_member)
<390ee> DW_AT_name : Fdb
<390f2> DW_AT_decl_file : 6
<390f3> DW_AT_decl_line : 27
<390f4> DW_AT_type : <0x38891>
<390f8> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)省略偏移量为6-32的结构杆件
<2><39159>: Abbrev Number: 15 (DW_TAG_member)
<3915a> DW_AT_name : (indirect string, offset: 0xc1d9a): OutMin
<3915e> DW_AT_decl_file : 6
<3915f> DW_AT_decl_line : 35
<39160> DW_AT_type : <0x38891>
<39164> DW_AT_data_member_location: 2 byte block: 23 24 (DW_OP_plus_uconst: 36)
<2><39167>: Abbrev Number: 16 (DW_TAG_member)
<39168> DW_AT_name : Out
<3916c> DW_AT_decl_file : 6
<3916d> DW_AT_decl_line : 36
<3916e> DW_AT_type : <0x38891>
<39172> DW_AT_data_member_location: 2 byte block: 23 28 (DW_OP_plus_uconst: 40)
<1><39176>: Abbrev Number: 3 (DW_TAG_typedef)
<39177> DW_AT_name : (indirect string, offset: 0xc00d0): PI_REG
<3917b> DW_AT_decl_file : 6
<3917c> DW_AT_decl_line : 37
<3917d> DW_AT_type : <0x390d7>
<1><3c348>: Abbrev Number: 29 (DW_TAG_variable)
<3c349> DW_AT_name : (indirect string, offset: 0xc3ece): BU_Uctrl_Udc_PI_Reg
<3c34d> DW_AT_decl_file : 1
<3c34e> DW_AT_decl_line : 40
<3c34f> DW_AT_type : <0x39176>
<3c353> DW_AT_external : 1
<3c354> DW_AT_location : 5 byte block: 3 fc 67 0 20 (DW_OP_addr: 200067fc)如果我想获取有关变量的信息,例如结构BU_Uctrl_Udc_PI_Reg,我必须执行以下操作:
Find an entry called “DW_TAG_variable” and gather following information:
------------------------------------------------------------------------
- DW_AT_name: The name is BU_Uctrl_Udc_PI_Reg
- DW_OP_addr: Base address is 200067fc
- DW_AT_type: The data type can be found at line 39176
Search line 39176 and gather following information:
-----------------------------------------------------
- It is a typedef (DW_TAG_typedef)
- DW_AT_name: The typedef name is PI_REG
- DW_AT_type: The definition can be found at line 390d7
Search line 390d7 and gather following information:
---------------------------------------------------
- It is a structure (DW_TAG_structure_type)
- DW_AT_byte_size: It is 44 bytes wide
Search the structure Members in upcoming lines until 44 bytes are reached:
--------------------------------------------------------
1. Member (DW_TAG_member):
- DW_AT_name: Ref
- DW_AT_data_member_location: 200067fc + 0
- DW_AT_type: The data type can be found at line 38891:
- DW_TAG_typedef: float32_t
- DW_AT_type: The data type can be found at line 38883:
- DW_TAG_base_type: float
- DW_AT_byte_size: 4 bytes
2. Member (DW_TAG_member):
- DW_AT_name: Fdb
- DW_AT_data_member_location: 200067fc + 4
- DW_AT_type: The data type can be found at line 38891:
- DW_TAG_typedef: float32_t
- DW_AT_type: The data type can be found at line 38883:
- DW_TAG_base_type: float
- DW_AT_byte_size: 4 bytes
[left out Members 3-9]
10. Member (DW_TAG_member):
- DW_AT_name: OutMin
- DW_AT_data_member_location: 200067fc + 36
- DW_AT_type: The data type can be found at line 38891:
- DW_TAG_typedef: float32_t
- DW_AT_type: The data type can be found at line 38883:
- DW_TAG_base_type: float
- DW_AT_byte_size: 4 bytes
11. Member (DW_TAG_member):
- DW_AT_name: Out
- DW_AT_data_member_location: 200067fc + 40
- DW_AT_type: The data type can be found at line 38891:
- DW_TAG_typedef: float32_t
- DW_AT_type: The data type can be found at line 38883:
- DW_TAG_base_type: float
- DW_AT_byte_size: 4 bytes坦率地说,脚本文件会比我的应用程序更复杂,因为它会自动收集上面提到的信息。此外,我必须承认,我真的不知道如何写这样的脚本。有没有更简单的方法来获取这种类型的信息?也许objdump有一些参数可以帮助我做到这一点,尽管我想我已经尝试了所有相关的参数?或者,是否存在能够做到这一点的工具?最后,我需要一个这样的表(另外,如果有所有的枚举就好了,当然也可以在.elf文件中找到):
0x200067fc float BU_Uctrl_Udc_PI_Reg.Ref
0x20006800 float BU_Uctrl_Udc_PI_Reg.Fdb
[…]
0x20006832 float BU_Uctrl_Udc_PI_Reg.OutMin
0x20006836 float BU_Uctrl_Udc_PI_Reg.Out带有参数-- http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0477c/index.html的工具Fromelf text(包含在KeilµVision中)正好提供了这样一个表,但不幸的是,我不能使用它,因为它应该需要使用.elf,或者在本例中称为使用Arm编译器工具链编译的.axf文件。此外,还有许可证问题。
谢谢你的任何提示。
发布于 2014-06-15 10:07:08
您应该能够要求GDB为您打印此信息,例如
gdb -q a.out
(gdb) ptype PI_REG发布于 2016-05-04 16:00:33
pahole是你需要的吗?它可以转储大小和偏移量的可变结构。
pahole −−reorganize −C foo xxx.out
struct foo {
int a; / 0 4 /
char c[4]; / 4 4 /
void b; / 8 8 /
long g; / 16 8 /
}; / size: 24, cachelines: 1 /
/ last cacheline: 24 bytes /
/ saved 8 bytes! /发布于 2015-07-29 20:19:26
您可以使用eclipse CDT的gdb mi接口以编程方式获取此信息。
private def loadElfFile(String elfFilePath) {
var plugin = new MIPlugin
var file = new File(elfFilePath)
var cmdFactory = new CommandFactory("mi2")
session = plugin.createSession(
MISession::PROGRAM,
'gdb',
cmdFactory,
file,
#[],
true,
new NullProgressMonitor
)
}您可以在其中查询全局变量及其类型。地址存储在值的hexAddress属性中。
这种方法的问题是它的速度慢。一个有50个成员的结构几乎需要10秒来处理。查询所有结构需要几分钟的时间。对于IDE工具用例(如模型转换),这是不切实际的。你必须深入潜水到精灵和矮人。
https://stackoverflow.com/questions/24143326
复制相似问题