??????????
????????????????????????????????????????????????????????????????????е???????????????λ????Щ???????????????????????????λ????????????????????????λ??????????????????????????????????????????????????????????????????????????????????????????С???????????????????Щ????????????????????λ??????????????????????η?????ú?????????????з???? -- ??ν???????
???????????????????£?
??????????? GOT.PLT ???????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????? fun@plt??
???????ж? fun ????????????? fun@plt ?????? ?????????????
????fun@plt:
????jmp *(fun@got.plt)
????push index
????jmp _init
???????е??????????? got.plt ????????????????????????????????????????got.plt ??????????????????????????ε?????? got.plt ?з???? fun@plt ?е????????????????е???ε??????fun@plt?е?????????????????????????????????У?????????????????????????????? got.plt ?е?????????????? init()???? init() ?????????????? fun ???????λ????????д?? got.plt ????????????????????ú?????
???????????????????????????? g_func2 ?????????? g_func ??:
????0000052f <g_func2>:
????52f: 55                    push   %ebp
????530: 89 e5                 mov    %esp??%ebp
????532: 53                    push   %ebx
????533: 83 ec 14              sub    $0x14??%esp
????536: e8 00 00 00 00        call   53b <g_func2+0xc>
????53b: 5b                    pop    %ebx
????53c: 81 c3 91 11 00 00     add    $0x1191??%ebx
????542: c7 45 f8 02 00 00 00  movl   $0x2??0xfffffff8(%ebp) // a = 2
????549: 83 ec 0c              sub    $0xc??%esp
????54c: 6a 03                 push   $0x3 // push argument 3 for g_func.
????54e: e8 d5 fe ff ff        call   428 <g_func@plt>
????553: 83 c4 10              add    $0x10??%esp
????556: 89 45 f4              mov    %eax??0xfffffff4(%ebp)
????559: 8b 45 f4              mov    0xfffffff4(%ebp)??%eax
????55c: 03 45 f8              add    0xfffffff8(%ebp)??%eax
????55f: 8b 5d fc              mov    0xfffffffc(%ebp)??%ebx
????562: c9                    leave
????563: c3                    ret
????????????? 536?? 53b?? 53c?? ??????? got.plt ?????λ??????????????????????????????????????????? %ebx = 0x53b + 0x1191 = 0x16cc?? ?????? 54e?? ????????????? g_func@plt:
????00000428 <g_func@plt>:
????428: ff a3 0c 00 00 00     jmp    *0xc(%ebx)
????42e: 68 00 00 00 00        push   $0x0
????433: e9 e0 ff ff ff        jmp    418 <_init+0x18>
???????????? %ebx ?з???? got.plt ??????g_func@plt ??????????????? got.plt ?? func ????????? func ???? 0xc + %ebx = 0xc + 0x16cc = 0x16d8?? ????????????????????????????λ???
????-bash-3.00$ objdump -R liba.so
????liba.so:     file format elf32-i386
????DYNAMIC RELOCATION RECORDS
????OFFSET   TYPE              VALUE
????000016e0 R_386_RELATIVE    *ABS*
????000016e4 R_386_RELATIVE    *ABS*
????000016bc R_386_GLOB_DAT    g_share
????000016c0 R_386_GLOB_DAT    __cxa_finalize
????000016c4 R_386_GLOB_DAT    _Jv_RegisterClasses
????000016c8 R_386_GLOB_DAT    __gmon_start__
????000016d8 R_386_JUMP_SLOT   g_func
????000016dc R_386_JUMP_SLOT   __cxa_finalize
??????????????????? g_func ????????????? 0x16d8 ?????????????????????????? got.plt:
????Contents of section .got.plt:
????16cc fc150000 00000000 00000000 2e040000  ................
????16dc 3e040000
????16d8 ??????????: 2e040000?? С?????????????? 0x000042e?? ?????? fun@plt ??????????????????е??????????????????????飬????????????????
??????
??????????????????????????λ??????????λ???????????????????????β???????????????????????????????????????????????????????????ò????????????????????е?Ч??????????????????????????????????????????????????????????????????????????????????????????????????????????????????е?Ч????????????????????????????????????????????????????乲???????????????????????????????????????????????????????????????????????????????????????????PIC ?????????????????????????