Fra tid til anden, når jeg adskiller x86-binære filer, snubler jeg henvisning til PLT
og GOT
, især når jeg kalder procedurer fra det adynamiske bibliotek.
For eksempel når du kører et program i gdb
:
(gdb) info fileSymboler fra "/home/user/hello".Local exec-fil:` / home / bruger / hej ', filtype elf64-x86-64. Indgangspunkt: 0x400400 0x0000000000400200 - 0x000000000040021c er .interp 0x000000000040021c - 0x000000000040023c er .note.ABI-tag 0x000000000040023c - 0x0000000000400260 er .00n00.60. id. hash 0x0000000000400288 - 0x00000000004002a4 er .gnu.hash 0x00000000004002a8 - 0x0000000000400308 er .dynsym 0x0000000000400308 - 0x0000000000400345 er .dynstr 0x0000000000400346 - 0x000000000040034e er .gnu.version 0x0000000000400350 - 0x0000000000400370 er .gnu.version_r 0x0000000000400370 - 0x0000000000400388 er .rela.dyn 0x0000000000400388 - 0x00000000004003b8 er .rela.plt 0x00000000004003b8 - 0x00000000004003c6 er .init = > 0x00000000004003d0 - 0x0000000000400400 er .plt 0x0000000000400400 - 0x00000000004005dc sige .text 0x00000000004005dc - 0x00000000004005e5 er .fini 0x00000000004005e8 - 0x00000000004005fa er .rodata 0x00000000004005fc - 0x0000000000400630 er .eh_frame_hdr 0x0000000000400630 - 0x00000000004006f4 er .eh_frame 0x00000000006006f8 - 0x0000000000600700 er .init_array 0x0000000000600700 - 0x0000000000600708 er .fini_array 0x0000000000600708 - 0x0000000000600710 er .jcr 0x0000000000600710 - 0x00000000006008f0 er .dynamic = > 0x00000000006008f0 - 0x00000000006008f8 er .got = > 0x00000000006008f8 - 0x0000000000600920 er .got.plt 0x0000000000600920 - 0x0000000000600930 er Data, 0x0000000000600930 - 0x0000000000600938 er .bss
Og derefter, når du adskiller ( sætter @ plt
):
(gdb) deaktiverer fooDump af samlekode for funktion foo:
0x000000000040050c < + 0>: skubbe% RBP 0x000000000040050d < + 1>: mov% RSP,% RBP 0x0000000000400510 < + 4>: sub $ 0x10,% RSP 0x0000000000400514 < + 8>: mov% edi, -0x4 (% RBP) 0x0000000000400517 < + 11>: mov $ 0x4005ec,% edi = > 0x000000000040051c < + 16>: callq 0x4003e0 <puts @ plt> 0x0000000000400521 < + 21>: leaveq 0x0000000000400522 < + 22>:. retqEnd af assembler dump
Så hvad er disse FÅR / PLT?