从对象符号表中构造成员详细信息

时间:2014-09-04 13:23:56

标签: c linux

尝试在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}的数据成员。如何从目标文件中了解结构成员详细信息。感谢您的支持

2 个答案:

答案 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>前缀,我相信它在树中是水平的) 。成员称为ac。两个成员都引用类型0x65,该类型在上面定义为带符号的int。

此官方教程是了解DWARF的好地方:http://www.dwarfstd.org/doc/Debugging%20using%20DWARF-2012.pdf