Что такое раздел <.got> в ELF?
Насколько я знаю, PLT
а также GOT
раздел для обработки динамически связанной функции.
Если код звонит printf
которая является функцией libc,
1. Во-первых, это вызывает PLT
получить printf
адрес.
2. И напишите этот адрес в GOT
раздел.
3. После второго вызова код использует функцию, написанную на GOT
,
Когда я внимательно изучаю бинарный файл ELF,
- Я нашел раздел PLT
имя в ELF <.plt>
,
- и раздел GOT
имя в ELF <.got.plt>
,
Но... Был также <.got>
раздел в ELF.
И я не мог понять, как этот раздел используется.
Q. Что такое использование <.got>
раздел?
И какая разница между <.got>
а также <.got.plt>
раздел?
PS 1. Это <.got>
раздел был очень маленьким, (он содержит только 4 байта в моем примере двоичного файла.)
И здесь я прикрепляю вид МАР <.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>.
2 ответа
Got.plt на самом деле является меньшим подмножеством раздела .got. Подумайте об указании на конец массива слотов. Концептуально это выглядит так
Int[10] получил;Int* gotplt=&got[5]
Раздел Got в основном может содержать адреса глобальных переменных и функций. Все глобальные переменные находятся в первой паре слотов, а суффикс - это все указатели на функции. gotplt - это первый слот .got, который содержит только адреса функций ..
В конце концов, после того, как адреса функций будут разрешены с помощью plt. Разрешенный адрес переходит в .gotplt, который, кстати, находится внутри .got, как я упоминал ранее.