Как получить адрес функции из текущего исполняемого файла?

Мне нужно знать адрес функции из текущего исполняемого файла на Solaris 10 с использованием C ++ (я использую GNU g ++ 4.9.2). Например, у меня есть функция, скажем как: void doSomething (const char * p), которая может быть или не быть определена в текущем исполняемом файле. Итак, я хотел бы найти функцию в текущем исполняемом файле, если он существует, а затем вызвать, что еще сделать некоторую операцию по умолчанию. Как я могу это сделать? Поможет ли dlsym?
Пожалуйста, помогите мне с синтаксисом и искаженным именем.

1

Решение

Вы можете получить список символов в вашем исполняемом файле, запустив 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"));
3

Другие решения

Нужно «позвонить 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.
}
0

По вопросам рекламы [email protected]