Ошибка сегментации при использовании dlsym после dlmopen, но с dlopen dlsym работает нормально

#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