Мне нужно узнать адрес функции из текущего исполняемого файла на Solaris 10 с использованием C++ (я использую GNU g++ 4.9.2). Например, у меня есть функция, например: void doSomething(const char *p), которая может быть определена или не определена в текущем исполняемом файле. Итак, я хотел бы найти функцию в текущем исполняемом файле, если она существует, а затем вызвать ее, чтобы выполнить некоторую операцию по умолчанию. Как я могу это сделать? Длсим поможет? Пожалуйста, помогите мне с синтаксисом и искаженным именем.
Как получить адрес функции из текущего исполняемого файла?
Ответы (2)
Вы можете получить список символов в вашем исполняемом файле, запустив nm exec
. Или, если вы пытаетесь получить символ из общей библиотеки, вы также можете nm
использовать библиотеку для символов. Выберите тот, который вы хотите, и загрузите его чем-то вроде...
void* handle = dlopen(NULL, RTLD_LAZY);
void* ptr = dlsym(handle, "mangled_name_you_got_from_nm");
Хотя вы, вероятно, захотите привести его к типу указателя функции функции, которую вы загружаете, с помощью чего-то вроде (очевидно, измените на соответствующий тип указателя функции)...
void* handle = dlopen(NULL, RTLD_LAZY);
auto ptr = reinterpret_cast<int(*)(int)>(dlsym(handle, "mangled_name_you_got_from_nm"));
-rdynamic
(или эквивалентным), функция не будет экспортирована в динамическую таблицу символов, и dlsym
вернет для нее NULL
.
- person Employed Russian; 21.12.2016
-rdynamic
(или эквивалентным) Еще раз: Solaris 10 не поддерживает ничего кроме динамического связывания, поэтому ваш комментарий излишен.
- person Andrew Henle; 05.01.2017
-rdynamic
указывает, какие символы экспортируются из динамически связанного исполняемого файла (по умолчанию, без -rdynamic
, только символы, на которые ссылается экспортируются другие общие библиотеки).
- person Employed Russian; 05.01.2017
Необходимость «вызывать foo()
, если он определен, и ничего не делать, если нет» довольно распространена в библиотеках.
Одним из распространенных примеров является вызов pthread_mutex_lock
и pthread_mutex_unlock
, если программа связана с потоками, но без блокировки в противном случае.
Слабые неразрешенные символы — идеальное решение.
extern void foo() __attribute__((weak));
void MaybeCallFoo()
{
if (&foo == NULL) { printf("foo is not defined\n"); return; }
foo(); // It is defined, call it.
}