Что вы имеете в виду, говоря "Я получаю предупреждение"?Проверяет ли ваша программа значение, возвращаемое 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()
перед любымдругие звонки дл.