#c #segmentation-fault #dynamic-linking #dlopen #dlsym
#c #ошибка сегментации #динамическое связывание #dlopen #dlsym
Вопрос:
У меня возникают проблемы с dlmopen, но я успешно использовал dlopen и dlsym в своей программе cpp (в Linux)
void *lib_handle = dlopen(lib_path, RTLD_NOW);
После этого я использовал dlsym для получения функции
function_type = (function_type)dlsym(lib_handle, "function_name")
и это сработало нормально, я даже успешно вызвал этот метод.
Но когда я попытался использовать dlmopen вместо dlopen для получения дескриптора библиотеки, я столкнулся с проблемами при вызове dlsym в дескрипторе. dlmopen требуется дополнительный параметр для указания пространства имен, в которое должна быть загружена библиотека. Я попытался использовать оба доступных значения (LM_ID_BASE, LM_ID_NEWLM).
void *lib_handle = dlmopen(LM_ID_NEWLM, lib_path, RTLD_NOW)
При вызове dlsym для получения адреса символа происходит сбой
dlsym(lib_handle, "function_name")
Ошибка связана с ошибкой сегментации
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7de019b in _dl_lookup_symbol_x (undef_name=0x555555556818 "function_name",
undef_map=0xfffffffff7ff5ae0, ref=0x7fffffffdf98, symbol_scope=0xfffffffff7ff5e68,
version=0x0, type_class=0, flags=2, skip_map=0x0) at dl-lookup.c:805
805 dl-lookup.c: No such file or directory.
Полная трассировка стека
#0 0x00007ffff7de019b in _dl_lookup_symbol_x (undef_name=0x555555556818 "function_name",
undef_map=0xfffffffff7ff5ae0, ref=0x7fffffffdf98,
symbol_scope=0xfffffffff7ff5e68, version=0x0, type_class=0, flags=2, skip_map=0x0) at dl-
lookup.c:805
#1 0x00007ffff6704fe6 in do_sym (flags=<optimized out>, vers=0x0, who=0x555555555fcf
<bind 31>, name=0x555555556818 "function_name",
handle=0xfffffffff7ff5ae0) at dl-sym.c:151
#2 _dl_sym (handle=0xfffffffff7ff5ae0, name=0x555555556818 "function_name", who=0x555555555fcf
<bind 31>) at dl-sym.c:254
#3 0x00007ffff7bd20e4 in dlsym_doit (a=a@entry=0x7fffffffe1e0) at dlsym.c:50
#4 0x00007ffff670551f in __GI__dl_catch_exception
(exception=exception@entry=0x7fffffffe170, operate=0x7ffff7bd20d0 <dlsym_doit>,
args=0x7fffffffe1e0)
at dl-error-skeleton.c:196
#5 0x00007ffff67055af in __GI__dl_catch_error (objname=0x7ffff7dd40f0 <last_result 16>,
errstring=0x7ffff7dd40f8 <last_result 24>,
mallocedp=0x7ffff7dd40e8 <last_result 8>, operate=<optimized out>, args=<optimized out>) at
dl-error-skeleton.c:215
#6 0x00007ffff7bd2745 in _dlerror_run (operate=operate@entry=0x7ffff7bd20d0 <dlsym_doit>,
args=args@entry=0x7fffffffe1e0) at dlerror.c:162
#7 0x00007ffff7bd2166 in __dlsym (handle=<optimized out>, name=0x555555556818 "function_name") at
dlsym.c:70
#8 0x0000555555555fcf in bind ()
#9 0x000055555555621c in test ()
#10 0x0000555555556313 in main ()
Я пробовал искать, но не смог найти решение. Я что-то здесь упускаю или неправильно вызываю dlmopen, пожалуйста, помогите мне здесь. Любые подсказки или предложения также будут полезны.
Комментарии:
1. Есть ли у вас какие-либо причины для использования
dlmopen
в первую очередь? Это вряд ли больше, чем нестандартный взлом для плохо написанных модулей.2. В любом случае, вы должны проверить свою программу с помощью
valgrind
3. Это может быть ошибка, если объект в lib_path пытается выполнить dlopen(RTLD_GLOBAL) в новом пространстве имен, созданном dlmopen(): sourceware.org/bugzilla/show_bug.cgi?id=16881