Добавление секции в ELF

Тема в разделе "WASM.UNIX", создана пользователем coder_x, 15 окт 2006.

  1. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    Поставил перед собой задачу добавить свой довольно объемный кусок кода в откомпиленый ELF экзешник. Решил добавить новый элемент в массив программных заголовков, а самы данные разместить в конце файла. Но при этом содержимое файла после массива программных заголовков сдвигается на 32 байта и надо ликвидтровать последствия этого сдвига. Вот что я сделал: увеличил оффсет таблицы заголовков секций, оффсет данных ээлементов из программных заголовков и заголовков секций. Все ээто делал ручками в Hiew. После сравнил получившийся файл с исходным,те посмотрел правильно ли Hiew видит начала всех секций, EP итд. Вроде все было нормально, но при запуске Segmentation fault. :dntknw: ELF формат для меня в новинку, так что я навернка упустил что-то важное и прошу помощи в этом деле.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    coder_x
    В конце обычно идёт bss (иначе загрузчик в последних Линуксах может не запустить эльф) и эту секцию нужно будет как-то "сдвинуть", чтобы всунуть новую секцию перед ней...

    Не понял. Надо увеличить на 1 значение e_phnum. Саму таблицу, если хотите, можно сдвинуть в любое свободное место в файле (найти дырку где-нибудь и переместить таблицу туда) и указать новое место в поле e_phoff. Больше ничего в заголовке менять не надо. Кстати, если в файле присутствует таблица e_shoff, то её можно безболезненно кильнуть, а это освободит немного места для увеличения таблицы e_phoff. Обычно в эльфах можно найти секции, которые не используются (хранят всякий мусор) ближе к концу файла. Такие секции тоже можно утилизировать под свои нужды.
     
  3. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    Мда, попытка сместить 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".
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    coder_x
    Возможно, если таблица попадает слишком далеко от начала заголовка, она просто не загружается в память (загрузчик сразу маппит в память кусок файла от заголовка эльфа, но, возможно, не весь файл, если файл большой). Поэтому вылетает ошибка. У меня похожих проблем никогда не возникало, но и файлы у меня, в основном, сравнительно маленькие и с минимальным набором секций.


    Так ведь код обращается к данным, в частности, по абсолютным адресам и такие адреса нужно пересчитать в коде (по типу релокации).
     
  5. coder_x

    coder_x New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    12
    Ну незнаю большой ли файл в 25кбайт, наверно маленький.
    Так я вроде оффсет секции то подправил чтоб на изначальные данные опять указывал, а виртуальный адрес p_vaddr тот же остался, имхо вроде должно все нормально быть, а и релоки вроде смещения о начала секции используют а не от начала файла.