Я пытаюсь переместить .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-разрядными общими объектами.
Что мне не хватает?