2010-08-24 7 views
1

У меня есть программа ANSI C, которая динамически загружает .so-файл, используя dlopen(), проходящий через RTLD_LAZY. Я получаюdlerror: Неопределенный символ «_nss_cache_cycle_prevention_function» на FreeBSD 7.2

Undefined symbol "_nss_cache_cycle_prevention_function" 

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

ответ

3

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

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

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

Решение (достаточно портативный) будет:

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

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

+0

Да, моя программа выплескивает любые возвращаемые значения NULL dlerror() в журнал после вызова dlsym(). Я сделал то, что вы сказали, и назвал dlerror(), прежде чем я позвонил dlsym(), и предупреждения Undefined symbol исчезли! Благодарю. –