LINUX.ORG.RU

Добавить секцию в готовый elf бинарник

 , ,


1

5

Мне надо добавить новую секцию с исполняемым кодом в уже готовый elf бинарник и поменять entry point чтобы выполнение начиналось именно с нее. Попробовал сделать это через objcopy, секцию оно добавляет, но пишет ворнинг:

$ objcopy --add-section .mytext=my_asm.bin --set-section-flags .mytext=readonly,code,alloc --change-section-address .mytext=66666666 test test2
BFD: test2: warning: allocated section `.mytext' not in segment
readelf показывает такую картину:
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         00000000004000b0  000000b0
       0000000000000034  0000000000000000  AX       0     0     16
  [ 2] .data             PROGBITS         00000000006000e4  000000e4
       000000000000000e  0000000000000000  WA       0     0     4
  [ 3] .mytext           PROGBITS         0000000003f940aa  001940aa
       0000000000000350  0000000000000000  AX       0     0     1
  [ 4] .shstrtab         STRTAB           0000000000000000  001943fa
       000000000000002f  0000000000000000           0     0     1
  [ 5] .symtab           SYMTAB           0000000000000000  001945f0
       0000000000000108  0000000000000018           6     7     8
  [ 6] .strtab           STRTAB           0000000000000000  001946f8
       000000000000002a  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
....

 Section to Segment mapping:
  Segment Sections...
   00     .text 
   01     .data 

Как(чем) мне добавить секцию .mytext в этот Section to Segment mapping? (Чем поменять entry point я как-нибудь сам разберусь, в крайнем случае через hex редактор это сделаю)

★★★★★

Последнее исправление: SZT (всего исправлений: 1)

А что мешает расширить секцию .text при помощи ld? Дыра в адресном пространстве есть и солидная. Просто ожидается что весь код будет в одном подряд идущем сегменте (хотя возможно и в разных секциях), а тут такая бодяга с несколькими фрагментами.

io ★★
()
Ответ на: комментарий от io

А что мешает расширить секцию .text при помощи ld?

В теории мне может не хватить места. А как через ld можно менять размер существующей секции?

SZT ★★★★★
() автор топика
Ответ на: комментарий от io

Попробовал просто слинковать с исполняемым elf файлом - получилось. Думал эта линковка только с объектными elf файлами работает

SZT ★★★★★
() автор топика
Ответ на: комментарий от io

Что-то ELF слинкованный с объектником не работает. Пишет при попытке запуска

$ qemu-arm -L /home/user/VDLinux-arm-v7a8v3r1/arm-v7a8v3r1-linux-gnueabi/sys-root/ ./some_elf2
error while loading shared libraries: eTable: cannot open shared object file: No such file or directory
При линковке оно еще ворнинг написало:
$ arm-linux-gnueabihf-ld -s armasm.o some_elf -o some_elf2
arm-linux-gnueabihf-ld: warning: cannot find entry symbol _start; defaulting to 000000000000a0c8
Как это правильно линковать?

SZT ★★★★★
() автор топика

ELF файл стрипнутый, если что

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Выполняемый elf-файл настроен на совершенно определенные адреса. Поэтому добавляя нужно умудриться оставить все на своем месте, так как вся relocation-информация о возможности перемещения потеряна. Обычно все происходит пристойно в том случае, когда сей файл стоит в списке первым. В противном случае обычно возникает фатальный сдвиг.

Лучше не использовать стрипнутый файл. Хотя это не является проблемой. Никто не мешает воспользоваться скрипт-файлом для определения имен и т.п. Стандартный скрипт-файл можно получить по --verbose (вывод зависит от других опций!). Но обычно достаточно доопределить что-то файликом в несколько строк.

io ★★
()
Ответ на: комментарий от io

Обычно все происходит пристойно в том случае, когда сей файл стоит в списке первым. В противном случае обычно возникает фатальный сдвиг.

Нет, ничего не получается. Даже если просто через линкер пропустить исполняемый файл без ничего.

$ ld /bin/echo -o echo_ld
ld: error in /bin/echo(.eh_frame); no .eh_frame_hdr table will be created.
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401330
$ ./echo_ld 
./echo_ld: error while loading shared libraries: _mb_cur_max: cannot open shared object file: No such file or directory
Хотя вот например с хелловордом на ассемблере это срабатывает, файл после этого запускается.

SZT ★★★★★
() автор топика
Ответ на: комментарий от io

Лучше не использовать стрипнутый файл. Хотя это не является проблемой. Никто не мешает воспользоваться скрипт-файлом для определения имен и т.п. Стандартный скрипт-файл можно получить по --verbose (вывод зависит от других опций!). Но обычно достаточно доопределить что-то файликом в несколько строк.

Мне именно стрипнутый файл надо дополнить своим кодом. Код этот я скорее всего на ассемблере напишу или на С с ассемблерными вставками, при том ELF файл под ARM архитектуру(но я и под x86-64 пробую). Что мне с этим скрипт-файлом делать, чтобы посредством него добавить код в стрипнутый ELF файл и чтобы этот ELF файл после этого запускался? Поподробнее

Есть у меня еще одно костыльное решение без расширения секции. Можно все данные в .text пожать каким-нибудь lzma и разместить там же, а еще разместить в освободившемся месте код, которым я хочу дополнить ELF файл и код, который сделает mmap(... PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS ...), перекопирует туда сжатый образ оригинального .text и код для распаковки этого образа в этот .text, и потом передавать управление в mmap-нутую область в функцию распаковки. Только тогда надо .text сделать writable, это можно через objcopy сделать. Но как-то слишком сложно получается

SZT ★★★★★
() автор топика
Ответ на: комментарий от SZT

Да, вариант c echo оказывается уже тоскливым. Из-за наличия ссылок на shared-библиотеки с версионными символами происходит разрушение некоторых таблиц и искажение имен символов (тот же _mb_cur_max существенно длиннее в начальном файле). Однако без ld (одним objcopy) сегмент не растянуть. Подозреваю, что все лечится, но к сожалению у меня сейчас нет времени на эксперименты.

io ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.