Что такое раздел <.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, как я упоминал ранее.

.got--> глобальные переменные

.got.plt--> глобальная функция

Другие вопросы по тегам