暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

elf格式详解(二)elf节之符号表分析

二进制人生 2020-05-25
2545

微信公众号:二进制人生
专注于嵌入式linux开发。
更新日期:2020/05/23,内容整理自网络。

前面介绍了elf文件的几个组成部分:

elf文件有两种视图,链接视图和执行视图。在链接视图里,elf文件被划分成了elf 头、节头表、若干的节(section);在执行视图里,elf文件被划分成了elf头、程序头表、段(segment)。

可以看到,段实际上包含了若干个节,执行视图是给程序启动用的,用于指示如何加载程序;而链接视图是连接时使用的,用于指示链接器如何链接文件。

节头表就是一个表,可以理解成一个结构体数组,每一项用于描述一个节。每个我们今天来看下其中的一个节【符号表】。
readelf -S a.out 查看节头表:

root@AI-Machine:/home/hongjh/2019_project# readelf -S  a.out  
There are 31 section headers, starting at offset 0x17d0:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4
  [ 3] .note.gnu.build-i NOTE            08048188 000188 000024 00   A  0   0  4
  [ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000020 04   A  5   0  4
  [ 5] .dynsym           DYNSYM          080481cc 0001cc 000040 10   A  6   1  4
  [ 6] .dynstr           STRTAB          080482000020000045 00   A  0   0  1
  [ 7] .gnu.version      VERSYM          08048252 000252 000008 02   A  5   0  2
  [ 8] .gnu.version_r    VERNEED         080482500025000020 00   A  6   1  4
  [ 9] .rel.dyn          REL             080482700027000008 08   A  5   0  4
  [10] .rel.plt          REL             08048284 000284 000008 08  AI  5  24  4
  [11] .init             PROGBITS        080482800028000023 00  AX  0   0  4
  [12] .plt              PROGBITS        080482b0 0002b0 000020 04  AX  0   0 16
  [13] .plt.got          PROGBITS        080482d0 0002d0 000008 00  AX  0   0  8
  [14] .text             PROGBITS        080482e0 0002e0 000172 00  AX  0   0 16
  [15] .fini             PROGBITS        08048454 000454 000014 00  AX  0   0  4
  [16] .rodata           PROGBITS        08048468 000468 000008 00   A  0   0  4
  [17] .eh_frame_hdr     PROGBITS        08048470 000470 0000200   A  0   0  4
  [18] .eh_frame         PROGBITS        0804849000490000c0 00   A  0   0  4
  [19] .init_array       INIT_ARRAY      08049f08 000f08 000004 00  WA  0   0  4
  [20] .fini_array       FINI_ARRAY      08049f0c 000f0c 000004 00  WA  0   0  4
  [21] .jcr              PROGBITS        08049f10 000f10 000004 00  WA  0   0  4
  [22] .dynamic          DYNAMIC         08049f14 000f14 0000e8 08  WA  6   0  4
  [23] .got              PROGBITS        08049ffc 000ffc 000004 04  WA  0   0  4
  [24] .got.plt          PROGBITS        0804a000 001000 000010 04  WA  0   0  4
  [25] .data             PROGBITS        0804a010 001010 000008 00  WA  0   0  4
  [26] .bss              NOBITS          0804a018 001018 000008 00  WA  0   0  4
  [27] .comment          PROGBITS        00000000 001018 000035 01  MS  0   0  1
  [28] .shstrtab         STRTAB          00000000 0016c3 0001000      0   0  1
  [29] .symtab           SYMTAB          00000000 001050 000450 10     30  47  4
  [30] .strtab           STRTAB          00000000 0014a0 000223 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

复制

可以看到该程序包含了31个节,今天我们关注.symtab和.dynsym这两个节。

动态符号表 (.dynsym) 用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。

而 .symtab 则保存所有符号,包括 .dynsym 中的符号。

符号的概念

什么是符号?我们将函数和全局变量(static局部变量也算)统称为符号(Symbol),函数名和变量名就是符号名(Symbol Name),我们可以将符号看做是链接中的粘合剂,整个链接过程正是基于符号才能够正确完成。每个目标文件都会有一个符号表(Symbol Table),即上图的.symtab段,这个表里记录了目标文件所用到的所有符号。每个定义的符号有一个对应的值,叫做符号值(Symbol Value),对于变量和函数来说,符号值就是它们的地址。

在本目标文件中引用的全局符号,却没有定义在本目标文件中,一般叫做外部符号。

实际上段名(比如.text),汇编语言里的标签(比如_start、_edata、_end),源文件名也是符号。

备注:局部变量临时分配在栈中,不会在过程外被引用,所以不会产生符号。

弱符号

待补充

root@AI-Machine:/home/hongjh/2019_project# readelf -s a.out           

Symbol table '.dynsym' contains 4 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     100000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     200000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
     30804846c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used

Symbol table '.symtab' contains 68 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     108048154     0 SECTION LOCAL  DEFAULT    1 
     208048168     0 SECTION LOCAL  DEFAULT    2 
     308048188     0 SECTION LOCAL  DEFAULT    3 
     4080481ac     0 SECTION LOCAL  DEFAULT    4 
     5080481cc     0 SECTION LOCAL  DEFAULT    5 
     60804820c     0 SECTION LOCAL  DEFAULT    6 
     708048252     0 SECTION LOCAL  DEFAULT    7 
     80804825c     0 SECTION LOCAL  DEFAULT    8 
     90804827c     0 SECTION LOCAL  DEFAULT    9 
    1008048284     0 SECTION LOCAL  DEFAULT   10 
    110804828c     0 SECTION LOCAL  DEFAULT   11 
    12080482b0     0 SECTION LOCAL  DEFAULT   12 
    13080482d0     0 SECTION LOCAL  DEFAULT   13 
    14080482e0     0 SECTION LOCAL  DEFAULT   14 
    1508048454     0 SECTION LOCAL  DEFAULT   15 
    1608048468     0 SECTION LOCAL  DEFAULT   16 
    1708048470     0 SECTION LOCAL  DEFAULT   17 
    180804849c     0 SECTION LOCAL  DEFAULT   18 
    1908049f08     0 SECTION LOCAL  DEFAULT   19 
    2008049f0c     0 SECTION LOCAL  DEFAULT   20 
    2108049f10     0 SECTION LOCAL  DEFAULT   21 
    2208049f14     0 SECTION LOCAL  DEFAULT   22 
    2308049ffc     0 SECTION LOCAL  DEFAULT   23 
    240804a000     0 SECTION LOCAL  DEFAULT   24 
    250804a010     0 SECTION LOCAL  DEFAULT   25 
    260804a018     0 SECTION LOCAL  DEFAULT   26 
    2700000000     0 SECTION LOCAL  DEFAULT   27 
    2800000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    2908049f10     0 OBJECT  LOCAL  DEFAULT   21 __JCR_LIST__
    3008048320     0 FUNC    LOCAL  DEFAULT   14 deregister_tm_clones
    3108048350     0 FUNC    LOCAL  DEFAULT   14 register_tm_clones
    3208048390     0 FUNC    LOCAL  DEFAULT   14 __do_global_dtors_aux
    330804a018     1 OBJECT  LOCAL  DEFAULT   26 completed.7209
    3408049f0c     0 OBJECT  LOCAL  DEFAULT   20 __do_global_dtors_aux_fin
    35080483b0     0 FUNC    LOCAL  DEFAULT   14 frame_dummy
    3608049f08     0 OBJECT  LOCAL  DEFAULT   19 __frame_dummy_init_array_
    3700000000     0 FILE    LOCAL  DEFAULT  ABS hj.c
    3800000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    3908048558     0 OBJECT  LOCAL  DEFAULT   18 __FRAME_END__
    4008049f10     0 OBJECT  LOCAL  DEFAULT   21 __JCR_END__
    4100000000     0 FILE    LOCAL  DEFAULT  ABS 
    4208049f0c     0 NOTYPE  LOCAL  DEFAULT   19 __init_array_end
    4308049f14     0 OBJECT  LOCAL  DEFAULT   22 _DYNAMIC
    4408049f08     0 NOTYPE  LOCAL  DEFAULT   19 __init_array_start
    4508048470     0 NOTYPE  LOCAL  DEFAULT   17 __GNU_EH_FRAME_HDR
    460804a000     0 OBJECT  LOCAL  DEFAULT   24 _GLOBAL_OFFSET_TABLE_
    4708048450     2 FUNC    GLOBAL DEFAULT   14 __libc_csu_fini
    4800000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
    4908048310     4 FUNC    GLOBAL HIDDEN    14 __x86.get_pc_thunk.bx
    500804a010     0 NOTYPE  WEAK   DEFAULT   25 data_start
    510804a018     0 NOTYPE  GLOBAL DEFAULT   25 _edata
    5208048454     0 FUNC    GLOBAL DEFAULT   15 _fini
    530804a010     0 NOTYPE  GLOBAL DEFAULT   25 __data_start
    5400000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    550804a014     0 OBJECT  GLOBAL HIDDEN    25 __dso_handle
    560804846c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used
    5700000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    58080483f0    93 FUNC    GLOBAL DEFAULT   14 __libc_csu_init
    590804a01c     0 NOTYPE  GLOBAL DEFAULT   26 _end
    60080482e0     0 FUNC    GLOBAL DEFAULT   14 _start
    6108048468     4 OBJECT  GLOBAL DEFAULT   16 _fp_hw
    620804a018     0 NOTYPE  GLOBAL DEFAULT   26 __bss_start
    63080483db    10 FUNC    GLOBAL DEFAULT   14 main
    6400000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    650804a018     0 OBJECT  GLOBAL HIDDEN    25 __TMC_END__
    6600000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
    670804828c     0 FUNC    GLOBAL DEFAULT   11 _init

复制

strip之后就查询不到静态符号表信息了,但是动态符号表信息还是可以查到的。

root@AI-Machine:/home/hongjh/2019_project# readelf -s a.out         

Symbol table '.dynsym' contains 4 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     100000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     200000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
     30804846c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used
root@AI-Machine:/home/hongjh/2019_project

复制

编译观察

我们来写一个测试程序:
oop.c:

#include <stdio.h>
int g_a = 10;      
static int g_s_b;
static int g_s_c = 0;
int g_d;
__thread int g_tls_e;
static __thread int g_tls_s_f;
__thread int g_tls_g = 0;
extern int g_e_h;
extern void fun1();
void fun()
{
        int l_i;
        g_d = 10
        static int l_s_i;
        g_e_h= 10;//外部变量和函数如果不使用的话,编译器不会为其产生符号表,因为会优化 
        fun1();
        printf("hello\n");
        return;
}

//定义一个弱函数
__attribute__((weak)) void fun_weak() 
{
        return;
}

复制

该程序定义了若干个变量用于覆盖所有情况。
前缀g表示全局,l表示局部,s表示静态,tls表示线程局部数据,e表示extern。

进行编译而不链接:

gcc oop.c -c 

复制

得到oop.o可重定位对象文件,前面说过,也是elf格式文件。

查看其节头表:

root@AI-Machine:/home/hongjh/2019_project# readelf -S oop.o
There are 13 section headers, starting at offset 0x3d0:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000034 000058 00  AX  0   0  4
  [ 2] .rel.text         REL             00000000 000340 000028 08   I 10   1  4
  [ 3] .data             PROGBITS        00000000 00008000004 00  WA  0   0  4
  [ 4] .bss              NOBITS          00000000 000090 0000000  WA  0   0  4
  [ 5] .tbss             NOBITS          00000000 000090 0000000 WAT  0   0  4
  [ 6] .rodata           PROGBITS        00000000 000090 0000000   A  0   0  4
  [ 7] .comment          PROGBITS        00000000 000090000201  MS  0   0  1
  [ 8] .note.GNU-stack   PROGBITS        00000000 0000c9 000000 00      0   0  1
  [ 9] .ARM.attributes   ARM_ATTRIBUTES  00000000 0000c9 000031 00      0   0  1
  [10] .symtab           SYMTAB          00000000 0000fc 0001e0 10     11  21  4
  [11] .strtab           STRTAB          00000000 0002dc 000063 00      0   0  1
  [12] .shstrtab         STRTAB          00000000 000368 000067 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)  

复制

查看其符号表:

root@AI-Machine:/home/hongjh/2019_project# readelf -s oop.o

Symbol table '.symtab' contains 30 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     100000000     0 FILE    LOCAL  DEFAULT  ABS oop.c
     200000000     0 SECTION LOCAL  DEFAULT    1 
     300000000     0 SECTION LOCAL  DEFAULT    3 
     400000000     0 SECTION LOCAL  DEFAULT    4 
     500000000     0 NOTYPE  LOCAL  DEFAULT    3 $d
     600000000     4 OBJECT  LOCAL  DEFAULT    4 g_s_b
     700000000     0 NOTYPE  LOCAL  DEFAULT    4 $d
     800000004     4 OBJECT  LOCAL  DEFAULT    4 g_s_c
     900000000     0 SECTION LOCAL  DEFAULT    5 
    1000000000     0 TLS     LOCAL  DEFAULT    5 $d
    1100000004     4 TLS     LOCAL  DEFAULT    5 g_tls_s_f
    1200000000     0 SECTION LOCAL  DEFAULT    6 
    1300000000     0 NOTYPE  LOCAL  DEFAULT    6 $d
    1400000000     0 NOTYPE  LOCAL  DEFAULT    1 $a
    1500000034     0 NOTYPE  LOCAL  DEFAULT    1 $d
    1600000040     0 NOTYPE  LOCAL  DEFAULT    1 $a
    1700000008     4 OBJECT  LOCAL  DEFAULT    4 l_s_i.4609
    1800000000     0 SECTION LOCAL  DEFAULT    8 
    1900000000     0 SECTION LOCAL  DEFAULT    7 
    2000000000     0 SECTION LOCAL  DEFAULT    9 
    2100000000     4 OBJECT  GLOBAL DEFAULT    3 g_a
    2200000004     4 OBJECT  GLOBAL DEFAULT  COM g_d
    2300000000     4 TLS     GLOBAL DEFAULT    5 g_tls_e
    2400000008     4 TLS     GLOBAL DEFAULT    5 g_tls_g
    2500000000    64 FUNC    GLOBAL DEFAULT    1 fun
    2600000000     0 NOTYPE  GLOBAL DEFAULT  UND fun1
    2700000000     0 NOTYPE  GLOBAL DEFAULT  UND puts
    2800000000     0 NOTYPE  GLOBAL DEFAULT  UND g_e_h
    2900000040    24 FUNC    WEAK   DEFAULT    1 fun_weak

复制

可以看到该符号表包含了30项(entry),每一项用Elf32_Sym结构体描述:

typedef struct
{

  Elf32_Word    st_name;                /* Symbol name (string tbl index) */
  Elf32_Addr    st_value;               /* Symbol value */
  Elf32_Word    st_size;                /* Symbol size */
  unsigned char st_info;                /* Symbol type and binding */
  unsigned char st_other;               /* Symbol visibility */
  Elf32_Section st_shndx;               /* Section index */
} Elf32_Sym;

复制

每一列的值其实都和结构体的成员相对应。

Name 符号的名字

Ndx 表示其所在section的序号,譬如g_a,初始化过的全局变量肯定在数据段.data,fun函数在代码段.text,【未经初始化的全局变量】和static变量在.bss段(static不管是否初始化都在bss段)。由于.bss段在程序启动时会被清0,所以未初始化的全局变量和static变量的值是0。
对于在本文件中引用到,但是在其他文件定义的符号,其Ndx为UND,例如本例的extern变量和函数。在链接阶段,找到该符号的定义之后,会对其Ndx进行修正。

Value  该符号的值(注意不是变量的值),符号的值就是指符号的地址,对于编译的中间文件.ol来说,value其实是该符号在其所在的section的偏移,是个相对值;对于链接后的可执行文件来说,该值是个绝对值,表示符号的绝对地址。

Type 表示符号的类型,常见的几种类型如下:

 484 #define STT_NOTYPE      0               /* Symbol type is unspecified */
 485 #define STT_OBJECT      1               /* Symbol is a data object */
 486 #define STT_FUNC        2               /* Symbol is a code object */
 487 #define STT_SECTION     3               /* Symbol associated with a section */
 488 #define STT_FILE        4               /* Symbol's name is file name */
 489 #define STT_COMMON      5               /* Symbol is a common data object */
 490 #define STT_TLS         6               /* Symbol is thread-local data object*/

复制

OBJECT  表示全局变量和static变量
FUNC    表示函数
FILE    文件名
COM     公用全局变量
TLS     线程本地数据

Bind列有以下几个常见值:

 472 #define STB_LOCAL       0               /* Local symbol */
 473 #define STB_GLOBAL      1               /* Global symbol */
 474 #define STB_WEAK        2               /* Weak symbol */

复制

分别表示局部、全局、弱符号。

最后一列Vis,表示该符号的可见范围,visibility的缩写:

 /* Symbol visibility specification encoded in the st_other field.  */
 #define STV_DEFAULT     0               /* Default symbol visibility rules */
 #define STV_INTERNAL    1               /* Processor specific hidden class */
 #define STV_HIDDEN      2               /* Sym unavailable in other modules */
 #define STV_PROTECTED   3               /* Not preemptible, not exported */ 

复制

我们看下.data段的序号是不是2:

  [ 2] .data             PROGBITS        00000000 00003c 000004 00  WA  0   0  4

复制

很明显是2。

g_a和g_d同为局部变量,为何g_d的序号叫COM,是个什么东西?前面说了,COM是COMMON的缩写,表示公用变量。对于全局变量如果在定义时没有赋值,在编译阶段编译器把它当做是声明。因为编译器不知道该变量是否在其他地方定义。等最终链接的时候实在找不到了,就把它理解成未初始化的全局变量,所以把它放到了.bss section。

链接观察

再新建一个main.c文件:

#include <stdio.h>
int main()
{
}

复制

将 main.c oop.c编译链接成可执行程序:

root@AI-Machine:/home/hongjh/2019_project# gcc main.c oop.c
root@AI-Machine:/home/hongjh/2019_project# readelf -s a.out 

Symbol table '.dynsym' contains 4 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     100000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     200000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
     30804849c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used

Symbol table '.symtab' contains 80 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     108048174     0 SECTION LOCAL  DEFAULT    1 
     208048188     0 SECTION LOCAL  DEFAULT    2 
     3080481a8     0 SECTION LOCAL  DEFAULT    3 
     4080481cc     0 SECTION LOCAL  DEFAULT    4 
     5080481ec     0 SECTION LOCAL  DEFAULT    5 
     60804822c     0 SECTION LOCAL  DEFAULT    6 
     708048272     0 SECTION LOCAL  DEFAULT    7 
     80804827c     0 SECTION LOCAL  DEFAULT    8 
     90804829c     0 SECTION LOCAL  DEFAULT    9 
    10080482a4     0 SECTION LOCAL  DEFAULT   10 
    11080482ac     0 SECTION LOCAL  DEFAULT   11 
    12080482d0     0 SECTION LOCAL  DEFAULT   12 
    13080482f0     0 SECTION LOCAL  DEFAULT   13 
    1408048300     0 SECTION LOCAL  DEFAULT   14 
    1508048484     0 SECTION LOCAL  DEFAULT   15 
    1608048498     0 SECTION LOCAL  DEFAULT   16 
    17080484a0     0 SECTION LOCAL  DEFAULT   17 
    18080484dc     0 SECTION LOCAL  DEFAULT   18 
    1908049f08     0 SECTION LOCAL  DEFAULT   19 
    2008049f08     0 SECTION LOCAL  DEFAULT   20 
    2108049f0c     0 SECTION LOCAL  DEFAULT   21 
    2208049f10     0 SECTION LOCAL  DEFAULT   22 
    2308049f14     0 SECTION LOCAL  DEFAULT   23 
    2408049ffc     0 SECTION LOCAL  DEFAULT   24 
    250804a000     0 SECTION LOCAL  DEFAULT   25 
    260804a010     0 SECTION LOCAL  DEFAULT   26 
    270804a01c     0 SECTION LOCAL  DEFAULT   27 
    2800000000     0 SECTION LOCAL  DEFAULT   28 
    2900000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    3008049f10     0 OBJECT  LOCAL  DEFAULT   22 __JCR_LIST__
    3108048340     0 FUNC    LOCAL  DEFAULT   14 deregister_tm_clones
    3208048370     0 FUNC    LOCAL  DEFAULT   14 register_tm_clones
    33080483b0     0 FUNC    LOCAL  DEFAULT   14 __do_global_dtors_aux
    340804a01c     1 OBJECT  LOCAL  DEFAULT   27 completed.7209
    3508049f0c     0 OBJECT  LOCAL  DEFAULT   21 __do_global_dtors_aux_fin
    36080483d0     0 FUNC    LOCAL  DEFAULT   14 frame_dummy
    3708049f08     0 OBJECT  LOCAL  DEFAULT   20 __frame_dummy_init_array_
    3800000000     0 FILE    LOCAL  DEFAULT  ABS hj.c
    3900000000     0 FILE    LOCAL  DEFAULT  ABS oop.c
    400804a020     4 OBJECT  LOCAL  DEFAULT   27 g_s_b
    410804a024     4 OBJECT  LOCAL  DEFAULT   27 g_s_c
    4200000004     4 TLS     LOCAL  DEFAULT   19 g_tls_s_f
    430804a028     4 OBJECT  LOCAL  DEFAULT   27 l_s_i.1490
    4400000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    45080485d8     0 OBJECT  LOCAL  DEFAULT   18 __FRAME_END__
    4608049f10     0 OBJECT  LOCAL  DEFAULT   22 __JCR_END__
    4700000000     0 FILE    LOCAL  DEFAULT  ABS 
    4808049f0c     0 NOTYPE  LOCAL  DEFAULT   20 __init_array_end
    4908049f14     0 OBJECT  LOCAL  DEFAULT   23 _DYNAMIC
    5008049f08     0 NOTYPE  LOCAL  DEFAULT   20 __init_array_start
    51080484a0     0 NOTYPE  LOCAL  DEFAULT   17 __GNU_EH_FRAME_HDR
    520804a000     0 OBJECT  LOCAL  DEFAULT   25 _GLOBAL_OFFSET_TABLE_
    5308048480     2 FUNC    GLOBAL DEFAULT   14 __libc_csu_fini
    5400000000     4 TLS     GLOBAL DEFAULT   19 g_tls_e
    5500000008     4 TLS     GLOBAL DEFAULT   19 g_tls_g
    5600000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
    5708048330     4 FUNC    GLOBAL HIDDEN    14 __x86.get_pc_thunk.bx
    580804a010     0 NOTYPE  WEAK   DEFAULT   26 data_start
    590804a01c     0 NOTYPE  GLOBAL DEFAULT   26 _edata
    6008048484     0 FUNC    GLOBAL DEFAULT   15 _fini
    6108048405    16 FUNC    GLOBAL DEFAULT   14 fun
    620804a02c     4 OBJECT  GLOBAL DEFAULT   27 g_d
    630804a010     0 NOTYPE  GLOBAL DEFAULT   26 __data_start
    6400000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    650804a014     0 OBJECT  GLOBAL HIDDEN    26 __dso_handle
    660804849c     4 OBJECT  GLOBAL DEFAULT   16 _IO_stdin_used
    6700000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    6808048415     6 FUNC    WEAK   DEFAULT   14 fun_weak
    6908048420    93 FUNC    GLOBAL DEFAULT   14 __libc_csu_init
    700804a030     0 NOTYPE  GLOBAL DEFAULT   27 _end
    7108048300     0 FUNC    GLOBAL DEFAULT   14 _start
    7208048498     4 OBJECT  GLOBAL DEFAULT   16 _fp_hw
    730804a01c     0 NOTYPE  GLOBAL DEFAULT   27 __bss_start
    74080483fb    10 FUNC    GLOBAL DEFAULT   14 main
    7500000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    760804a018     4 OBJECT  GLOBAL DEFAULT   26 g_a
    770804a01c     0 OBJECT  GLOBAL HIDDEN    26 __TMC_END__
    7800000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
    79080482ac     0 FUNC    GLOBAL DEFAULT   11 _init

复制

可以看到,链接之后value一列变成了符号的绝对地址,该值和程序运行时的值是一致的。下一节我们站在a.out运行时的角度来分析其他的节:
.bss,.data,.text等。这些节我们是再熟悉不过了。


图:二进制人生公众号



文章转载自二进制人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论