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 файлы заголовков в мою программу. Я хотел бы либо включить эту функцию в переносимом виде или подавить эти предупреждения.
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()
перед любыми другими звонками.