dlerror: неопределенный символ «_nss_cache_cycle_prevention_function» в FreeBSD 7.2 - PullRequest
1 голос
/ 24 августа 2010

У меня есть программа 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 Ответ

3 голосов
/ 31 августа 2010

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

...