Перемещение таблицы перемещения ELF64

Я пытаюсь переместить .rela.plt таблицу перемещения общего объекта в конец файла (потому что в будущем я собираюсь добавить новые записи о перемещении).

Сначала я прочитал все записи в разделе .rela.plt. Исходный раздел находится по смещению 0x528, а .rela.dyn по смещению 0x600. Затем я копирую содержимое .rela.dyn в конец файла; до смещения 0xa528. Я обновляю запись в таблице заголовков раздела для .rela.dyn, добавляя 0xa000 в поля sh_addr и sh_offset. Я обновляю запись DT_RELA в динамической таблице новым адресом; и, наконец, я добавляю сегмент LOAD (с разрешениями RWX) в конец таблицы заголовков программы.

В результате R_X86_64_RELATIVE записей в таблице перемещений разрешены правильно; но динамический компоновщик не обновляет адреса для внешних вызовов в GOT, что вызывает ошибку сегментации. Этого не происходит с 32-разрядными общими объектами.

Что мне не хватает?


person kubuzetto    schedule 10.12.2015    source источник


Ответы (1)


Я решил проблему, добавив таблицу .rel.plt сразу после таблицы .rel.dyn. То есть между ними не должно быть ни одного избыточного байта; нет выравнивающих отступов, никаких других разделов, ничего. По какой-то причине динамический загрузчик ожидает, что сегменты перемещения будут непрерывными. Запись JMPREL в динамическом разделе кажется избыточной на x64.

person kubuzetto    schedule 15.12.2015