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() перед любыми другими звонками.

Другие вопросы по тегам