dlsym(RTLD_NEXT, msgctl) не возвращает версию по умолчанию

Если библиотека определяет несколько версий одного и того же символа, 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 не всегда должен возвращать последний символ для обеспечения совместимости, но почему бы не вернуть символ по умолчанию?

Кто-нибудь знает о причинах этого?


person Kapil Arya    schedule 24.02.2013    source источник
comment
Я только что наткнулся на следующий вопрос: stackoverflow.com/questions/12342133/ Существует указатель на: blog.fesnel.com/blog/2009/08/25/, который описывает, что dlsym всегда возвращает старый символ, не обращая внимания на версию (@@) по умолчанию. Так что, я думаю, ничего нельзя сделать, если у кого-то нет предложений.   -  person Kapil Arya    schedule 24.02.2013


Ответы (2)


Об этом сообщается как об ошибке glibc:

Насколько я знаю, это еще не исправлено.

person Florian Weimer    schedule 21.07.2017
comment
dlsym не вызывает malloc в случае успеха. Текущая реализация glibc использует malloc для сохранения сообщения об ошибке для dlerror в случае сбоя. Промежуточный malloc, который использует RTLD_NEXT, может иметь резервный распределитель для решения таких проблем с повторным входом. - person Florian Weimer; 10.11.2017
comment
Вам нужно будет проверить реализацию или обратиться за советом к libc-help. Я не ожидаю, что обычные режимы dladdr1 будут вызывать malloc, но могут быть специальные режимы, которые это делают. - person Florian Weimer; 10.11.2017

Весь смысл RTLD_NEXT в том, чтобы вернуть символ после первого, по умолчанию. Разве вы не просто ищете RTLD_DEFAULT?

person Dolda2000    schedule 24.02.2013
comment
Я предварительно загрузил библиотеку, которая помещает обертки вокруг определенных символов. Чтобы вызвать версию libc, он использует dlsym(RDLD_NEXT, ...) - person Kapil Arya; 24.02.2013