dlerror: неопределенный символ _nss_cache_cycle_prevention_function во FreeBSD 7.2

У меня есть программа ANSI C, которая динамически загружает файл .so, используя dlopen(), передавая RTLD_LAZY. я получаю

Undefined symbol "_nss_cache_cycle_prevention_function"

предупреждения при каждом доступе к файлу .so в FreeBSD 7.2. nss_cache_cycle_prevention_function() не является одной из функций моей программы, и я полагаю, что она должна исходить от FreeBSD. Это также может быть проблемой в Linux, хотя я не испытываю там проблемы. Я бы предпочел не загружать файлы заголовков FreeBSD в свою программу. Я хотел бы либо включить эту функцию переносимым способом, либо подавить эти предупреждения.


person John Scipione    schedule 24.08.2010    source источник


Ответы (1)


Что вы имеете в виду, говоря: «Я получаю предупреждение»? Проверяет ли ваша программа значение, возвращаемое dlerror(), и печатает ли оно, если оно не равно NULL?

_nss_cache_cycle_prevention_function — это символ маркера, который используется nsdispatch(3) во FreeBSD, чтобы определить, следует ли использовать службы nscd(8), демона кэширования службы имен. Совершенно нормально, что его нет ни в исполняемом файле, ни в разделяемой библиотеке.

Но когда nsdispatch(3) выполнит dlsym(3), а символ не будет найден, будет установлена ​​ошибка. И dlerror(3) возвращает описание последней ошибки, а не описание ошибки последнего вызова. Я подозреваю, что это вы бьете.

Решение (довольно переносимое) будет заключаться в следующем:

  • для dlopen(3) проверьте его возвращаемое значение перед использованием dlerror(), чтобы увидеть, была ли вообще ошибка;
  • для dlsym(3), поскольку NULL является допустимым возвращаемым значением, для вызова dlerror() в пустом контексте перед вызовом dlsym(3); это устранит любую предыдущую ошибку, так что можно доверять тому, что второй вызов dlerror(3) вернет позже.

В общем, вызов пустой dlerror() перед любыми другими вызовами dl* ничему не повредит.

person Grrrr    schedule 30.08.2010
comment
Да, моя программа выдает все ненулевые значения, возвращаемые dlerror(), в журнал после вызова dlsym(). Я сделал то, что вы сказали, и вызвал dlerror(), прежде чем я вызвал dlsym(), и предупреждения о неопределенных символах исчезли! Спасибо. - person John Scipione; 31.08.2010