尝试在linux中使用objdump命令在可执行文件中显示符号表信息。 我在下面尝试了一个简单的程序。
#include<stdio.h>
int global = 0;
typedef struct global_struct{
int a;
int c;
}global_struct;
global_struct gs;
int main()
{
printf("%d\n",global);
printf("%d\n",gs.a);
return 0;
}
在gcc编译器中使用-g选项编译 objdump的输出看起来像
00000000004005b0 l F .text 0000000000000000 __do_global_ctors_aux 0000000000000000 l df *ABS* 0000000000000000 symboltable.c 0000000000600870 l O .got.plt 0000000000000000 _GLOBAL_OFFSET_TABLE_ 00000000006006ac l .ctors 0000000000000000 __init_array_end 00000000006006ac l .ctors 0000000000000000 __init_array_start 00000000006006d8 l O .dynamic 0000000000000000 _DYNAMIC 0000000000600898 w .data 0000000000000000 data_start 00000000006008b4 g O .bss 0000000000000008 gs 0000000000000000 F *UND* 0000000000000000 printf@@GLIBC_2.2.5 0000000000400510 g F .text 0000000000000002 __libc_csu_fini 00000000004003e0 g F .text 0000000000000000 _start 0000000000000000 w *UND* 0000000000000000 __gmon_start__ 0000000000000000 w *UND* 0000000000000000 _Jv_RegisterClasses 00000000004005e8 g F .fini 0000000000000000 _fini 0000000000000000 F *UND* 0000000000000000 __libc_start_main@@GLIBC_2.2 00000000006008b0 g O .bss 0000000000000004 global 00000000004005f8 g O .rodata 0000000000000004 _IO_stdin_used 0000000000600898 g .data 0000000000000000 __data_start 0000000000400600 g O .rodata 0000000000000000 .hidden __dso_handle 00000000006006c8 g O .dtors 0000000000000000 .hidden __DTOR_END__ 0000000000400520 g F .text 0000000000000089 __libc_csu_init 000000000060089c g *ABS* 0000000000000000 __bss_start 00000000006008c0 g *ABS* 0000000000000000 _end
我的要求是 gs 是C结构,我想知道gs {a,b}的数据成员。如何从目标文件中了解结构成员详细信息。感谢您的支持
答案 0 :(得分:1)
结构成员详细信息未在目标文件中详细说明。目标文件只有足够的内存分配来保存结构,偏移量告诉链接器在哪里找到它。
编译器在编译时知道基础结构指针的偏移量,以便在每次使用时找到成员并将其编码到程序文本中。
答案 1 :(得分:0)
如果在构建程序时将-g
传递给gcc
,则应该在以下位置编译DWARF调试信息:
$ objdump -t prog | grep debug
0000000000000000 l d .debug_aranges 0000000000000000 .debug_aranges
0000000000000000 l d .debug_info 0000000000000000 .debug_info
0000000000000000 l d .debug_abbrev 0000000000000000 .debug_abbrev
0000000000000000 l d .debug_line 0000000000000000 .debug_line
0000000000000000 l d .debug_str 0000000000000000 .debug_str
然后您可以使用objdump
进行阅读:
$ objdump --dwarf=info prog
[...]
<1><65>: Abbrev Number: 5 (DW_TAG_base_type)
<66> DW_AT_byte_size : 4
<67> DW_AT_encoding : 5 (signed)
<68> DW_AT_name : int
[...]
<1><2f8>: Abbrev Number: 8 (DW_TAG_structure_type)
<2f9> DW_AT_name : (indirect string, offset: 0x22f): global_struct
<2fd> DW_AT_byte_size : 8
<2fe> DW_AT_decl_file : 1
<2ff> DW_AT_decl_line : 3
<300> DW_AT_decl_column : 16
<301> DW_AT_sibling : <0x31c>
<2><305>: Abbrev Number: 17 (DW_TAG_member)
<306> DW_AT_name : a
<308> DW_AT_decl_file : 1
<309> DW_AT_decl_line : 4
<30a> DW_AT_decl_column : 9
<30b> DW_AT_type : <0x65>
<30f> DW_AT_data_member_location: 0
<2><310>: Abbrev Number: 17 (DW_TAG_member)
<311> DW_AT_name : c
<313> DW_AT_decl_file : 1
<314> DW_AT_decl_line : 5
<315> DW_AT_decl_column : 9
<316> DW_AT_type : <0x65>
<31a> DW_AT_data_member_location: 4
<2><31b>: Abbrev Number: 0
<1><31c>: Abbrev Number: 2 (DW_TAG_typedef)
<31d> DW_AT_name : (indirect string, offset: 0x22f): global_struct
<321> DW_AT_decl_file : 1
<322> DW_AT_decl_line : 6
<323> DW_AT_decl_column : 2
<324> DW_AT_type : <0x2f8>
[...]
在这里我们可以看到global_struct
的DIE(调试信息条目)有两片叶子(两片DW_TAG_member
,请看<2>
前缀,我相信它在树中是水平的) 。成员称为a
和c
。两个成员都引用类型0x65
,该类型在上面定义为带符号的int。
此官方教程是了解DWARF的好地方:http://www.dwarfstd.org/doc/Debugging%20using%20DWARF-2012.pdf