Использование dlopen () на исполняемом файле - PullRequest
13 голосов
/ 08 июля 2011

Мне нужно вызвать функцию из другой программы. Если бы другая программа была библиотекой, я мог бы просто использовать dlopen и dlsym, чтобы получить указатель на функцию. К сожалению, другая программа - это исполняемый файл Unix, и сборка ее как библиотеки не возможна. Попытка dlopen () на исполняемом файле выдает следующее сообщение об ошибке:

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

Это неудивительно, поскольку dlopen предназначен для использования с библиотеками, а не с исполняемыми файлами. Есть ли способ заставить dlopen и dlsym работать с исполняемыми файлами? Если нет, есть ли альтернативный способ достижения того же самого?

Ответы [ 4 ]

7 голосов
/ 08 июля 2011

Вы не можете открывать исполняемые файлы как библиотеки. Точка входа исполняемого файла будет пытаться повторно инициализировать библиотеку C и получить указатель brk. Это повредит вашу кучу malloc. Кроме того, исполняемый файл, скорее всего, будет отображаться по фиксированному адресу без перемещений, и если этот адрес перекрывается с чем-либо уже загруженным, его также невозможно отобразить по этой причине.

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

Обратите внимание, что это не обязательно относится к исполняемым файлам PIE. Однако, если исполняемый файл не предназначен специально для dlopen() ed, это небезопасно, так как main() не будет запущен, и поэтому любая инициализация, выполненная в main(), не произойдет.

6 голосов
/ 08 июля 2011

В некоторых системах ELF (особенно в Linux) вы можете dlopen() исполняемые файлы PIE. При использовании GCC просто скомпилируйте исполняемый файл с -fpie или -fPIE и свяжите его с -pie и экспортируйте соответствующие символы с помощью --dynamic-list или -rdynamic (более подробно объяснено в этого другого SO ответить .

1 голос
/ 16 июня 2015

Инструмент, предназначенный именно для этого, обрабатывает ASLR / PIE и не ASLR / PIE. Компилируется на x86, ARM и MIPS (только 32-разрядная версия). Отредактируйте Makefile, чтобы установить параметр ARCH.

http://rtfc.org.uk/cliapi.html

Это мой инструмент, но он, кажется, делает то, что ты хочешь. Дайте мне знать, если это не сработает для вас.

Я ценю, как поздно я на этой вечеринке, но эй.

0 голосов
/ 31 июля 2013

Для добавления возможности загрузки исполняемых файлов через dlopen зарегистрирован как отказавший glibc RFE (Request For Enhancement).Подробный взгляд на RFE и возможный подход для некоторых особых случаев можно найти по адресу

[http://sourceware.org/bugzilla/show_bug.cgi?id=11754][1]

. За исключением PIE, было бы много проблем за сценой для реализации такой функциональности.

...