Каков самый простой способ поиска имен функций двоичного файла с кросс-платформенным способом? - PullRequest
1 голос
/ 16 сентября 2008

Я хочу написать небольшую утилиту для вызова произвольных функций из совместно используемой библиотеки C. Пользователь должен иметь возможность перечислять все экспортируемые функции, аналогичные тем, что делает objdump или nm. Я проверил источник этих утилит, но они пугают. Не удалось найти достаточно информации в Google, если библиотека dl также имеет эту функцию.

(Уточнение: я не хочу просто вызывать функцию, которая заранее известна. Буду признателен за фрагмент примера вместе с вашим ответом.)

Ответы [ 8 ]

2 голосов
/ 16 сентября 2008

Хорошо, я немного расскажу о Windows. Функции C, экспортируемые из DLL, не содержат информации о типах, именах или количестве аргументов - и я не верю, что вы можете определить, каково соглашение о вызовах для данной функции.

Для сравнения взгляните на среду программирования LabVIEW компании National Instrument. Вы можете импортировать функции из DLL, но вы должны вручную ввести тип и имена аргументов, прежде чем использовать данную функцию. Если это ограничение в порядке, отредактируйте ваш вопрос, чтобы отразить это.

Я не знаю, что возможно в * nix средах.

РЕДАКТИРОВАТЬ: Относительно вашего разъяснения. Если вы не знаете, что за функция опережает время, вы довольно придирчивы к Windows, потому что в общем случае вы не сможете определить, какое количество и типы аргументов принимают функции.

2 голосов
/ 16 сентября 2008

Это может быть рядом с тем, что вы ищете: http://python.net/crew/theller/ctypes/

1 голос
/ 17 сентября 2008

Кажется, что только разумное решение (без изобретения колеса) использует libbfd. Недостатки в том, что его документация скудна, и она немного раздута для моих целей.

1 голос
/ 16 сентября 2008

Стандартным API является API dlopen / dlsym; AFAIK. Он реализован GNU libc в стандартной библиотеке C для Linux и Mac OS X (libSystem) и может быть реализован в Windows с помощью MinGW или других пакетов совместимости.

1 голос
/ 16 сентября 2008

Вы можете попробовать SymtabAPI от ParaDyn. Он позволяет вам захватывать все символы в общей библиотеке (или исполняемом файле) и просматривать их типы, смещения и т. Д. Все это заключено в довольно приятный интерфейс C ++ и работает на многих платформах. Он также обеспечивает поддержку бинарного переписывания, которое вы потенциально можете использовать для выполнения своих задач во время выполнения.

Веб-страница здесь:

http://www.paradyn.org/html/symtab2.1-features.html

Документация здесь:

http://ftp.cs.wisc.edu/paradyn/releases/release5.2/doc/symtabProgGuide.21.pdf

0 голосов
/ 16 сентября 2008

Я написал что-то подобное в Perl. В Win32 он запускает dumpbin / exports, в POSIX - nm -gP. Затем, поскольку это Perl, результаты интерпретируются с использованием регулярных выражений: / _ (\ S +) @ \ d + / для Win32 (функции stdcall) и / ^ (\ S +) T / для POSIX.

0 голосов
/ 16 сентября 2008

Ик! Вы затронули одну из очень зависимых от платформы тем программирования. В Windows у вас есть DLL, в Linux у вас есть ld.so, ld-linux.so и Mac OS X's dyld.

0 голосов
/ 16 сентября 2008

Исходный код для nm и objdump доступен. Если вы хотите начать со спецификации, то ELF - это то, что вы хотите изучить.

/ Allan

...