Есть ли более простой способ сделать это, чем воссоздать весь ELF с нуля
Конечно: заголовки программы формируют таблицу с фиксированными записями со смещением, заданным ehdr.e_phoff
, содержащим .e_phnum
записей .e_phentsize
байтов.
Чтобы удалить одну запись, просто скопируйте остальные записи поверх нее и уменьшите .e_phnum
. Это все, что нужно сделать.
Осторожно: удаление некоторых записей может привести к сбою динамического загрузчика. GNU_STACK
- это единственный заголовок, который можно удалить без особого вреда (о чем я могу подумать).
Обновление:
Да, установка .p_type
в PT_NULL
- еще один (и более простой) подход. Но такие записи, как правило, не должны присутствовать, и вы можете найти некоторые системы, в которых PT_NULL
вызовет утверждение в загрузчике (или в какой-либо другой программе).
Наконец, добавить новый Phdr
может быть сложно. Обычно нет места для расширения таблицы (так как сразу за ней следуют некоторые другие данные, например, .text
). Вы можете переместить таблицу в конец файла и установить .e_phoff
и .e_phnum
в соответствии с новой таблицей, но многие программы ожидают, что вся таблица Phdr
будет загружена и доступна во время выполнения, а это не так. легко организовать, так как новое местоположение в конце файла не будет "покрыто" ни одним сегментом PT_LOAD
.