Если библиотека определяет несколько версий одного и того же символа, dlsym(RTLD_NEXT, "symbol")
возвращает более старый символ, даже если этот старый символ не является символом по умолчанию.
Например, libpthread определяет две версии pthread_cond_broadcast:
$:> nm -g /lib64/libpthread-2.15.so|grep pthread_cond_broadcast
000000000000bfc0 T pthread_cond_broadcast@@GLIBC_2.3.2
000000000000c310 T pthread_cond_broadcast@GLIBC_2.2.5
- «GLIBC_2.3.2» — это версия по умолчанию, которую вы получаете при линковке с помощью libpthread (без участия dlsym). (Обратите внимание на «@@», который обозначает символ по умолчанию)
- «GLIBC_2.2.5» — старая версия.
Теперь, если я использую dlsym(RTLD_NEXT, "pthread_cond_broadcast"), я всегда получаю версию GLIBC_2.2.5, а не версию GLIBC_2.3.2. Конечно, можно использовать dlvsym для получения версии по умолчанию, но это усложняется, если нужно сделать это для большого количества символов, и многие из них имеют разные новые/старые версии.
Я понимаю, что RTLD_NEXT не всегда должен возвращать последний символ для обеспечения совместимости, но почему бы не вернуть символ по умолчанию?
Кто-нибудь знает о причинах этого?