Поставил перед собой задачу добавить свой довольно объемный кусок кода в откомпиленый ELF экзешник. Решил добавить новый элемент в массив программных заголовков, а самы данные разместить в конце файла. Но при этом содержимое файла после массива программных заголовков сдвигается на 32 байта и надо ликвидтровать последствия этого сдвига. Вот что я сделал: увеличил оффсет таблицы заголовков секций, оффсет данных ээлементов из программных заголовков и заголовков секций. Все ээто делал ручками в Hiew. После сравнил получившийся файл с исходным,те посмотрел правильно ли Hiew видит начала всех секций, EP итд. Вроде все было нормально, но при запуске Segmentation fault. ELF формат для меня в новинку, так что я навернка упустил что-то важное и прошу помощи в этом деле.
coder_x В конце обычно идёт bss (иначе загрузчик в последних Линуксах может не запустить эльф) и эту секцию нужно будет как-то "сдвинуть", чтобы всунуть новую секцию перед ней... Не понял. Надо увеличить на 1 значение e_phnum. Саму таблицу, если хотите, можно сдвинуть в любое свободное место в файле (найти дырку где-нибудь и переместить таблицу туда) и указать новое место в поле e_phoff. Больше ничего в заголовке менять не надо. Кстати, если в файле присутствует таблица e_shoff, то её можно безболезненно кильнуть, а это освободит немного места для увеличения таблицы e_phoff. Обычно в эльфах можно найти секции, которые не используются (хранят всякий мусор) ближе к концу файла. Такие секции тоже можно утилизировать под свои нужды.
Мда, попытка сместить e_phoff таблицу в конец файла где ее можно безболезненно расширять привела к ошибке "Inconsistency detected by ld.so: rtld.c: 646: dl_main: Assertion '_dl_rtld_map.l_libname' failed", кстати присутсвует заголовок с типом PHDR, оффсет которого я поправил на новое положение e_phoff. Я так понял загрузчик ругается на нестандартное положение таблицы e_phoff, никак не пойму почему, ведь виртуальный адрес PHDR ээлемента я не менял и при загрузке по идее разницы быть не должно, если конечно загрузчик не плюет на PHDR и не создает секцию ориентируясь на ее смещение. Еще пробовал просто освободить немного места между кодом и данными не меняя положения и содержания таблицы e_phoff, сместив секции данных описываемые в e_phoff на килобайт и забив нулями промежуток. При этом я увеличил оффсеты у этих секций в e_phoff.p_offset на 1024 соответственно - в итоге вернулся к тому с чего начинал -"segmentation fault".
coder_x Возможно, если таблица попадает слишком далеко от начала заголовка, она просто не загружается в память (загрузчик сразу маппит в память кусок файла от заголовка эльфа, но, возможно, не весь файл, если файл большой). Поэтому вылетает ошибка. У меня похожих проблем никогда не возникало, но и файлы у меня, в основном, сравнительно маленькие и с минимальным набором секций. Так ведь код обращается к данным, в частности, по абсолютным адресам и такие адреса нужно пересчитать в коде (по типу релокации).
Ну незнаю большой ли файл в 25кбайт, наверно маленький. Так я вроде оффсет секции то подправил чтоб на изначальные данные опять указывал, а виртуальный адрес p_vaddr тот же остался, имхо вроде должно все нормально быть, а и релоки вроде смещения о начала секции используют а не от начала файла.