Насколько я знаю, PLT
и GOT
- это раздел для работы с динамически связанной функцией.
Если код вызывает printf
, который является функцией libc,
1. Сначала он вызывает PLT
, чтобы получить адрес printf
.
2. И запишите этот адрес в раздел GOT
.
3. После второго вызова код использует функцию, записанную в GOT
.
Когда я внимательно изучаю двоичный файл ELF,
- Я нашел название раздела PLT
в ELF <.plt>
.
- И название секции GOT
в ELF - <.got.plt>
.
Но ... В ELF был также раздел <.got>
.
И я не мог понять, как этот раздел используется.
Q. Что такое использование <.got>
раздела?
А в чем разница между <.got>
и <.got.plt>
секцией?
PS 1. Этот раздел <.got>
был очень маленьким (в моем двоичном образце он содержит только 4 байта).
И здесь я прикрепляю представление IDA раздела <.got>
:
.got:08049FFC ; ===========================================================================
.got:08049FFC
.got:08049FFC ; Segment type: Pure data
.got:08049FFC ; Segment permissions: Read/Write
.got:08049FFC _got segment dword public 'DATA' use32
.got:08049FFC assume cs:_got
.got:08049FFC ;org 8049FFCh
.got:08049FFC __gmon_start___ptr dd offset __imp___gmon_start__
.got:08049FFC ; DATA XREF: _init_proc+F↑r
.got:08049FFC ; __gmon_start__↑r
.got:08049FFC _got ends
.got:08049FFC
PS2. Я также проверил здесь , но мне не хватило ответа, чтобы понять использование раздела <.got>.