2014-12-08 2 views
2

У меня есть две общие библиотеки: a.so и b.so.Как определить, был ли загружен такой файл или нет?

a.so должен быть загружен до загрузки b.so. И, a.so может быть загружен другими модулями, а не мной.

Итак, я хочу определить, загружен ли файл a.so, прежде чем я позвоню dlopen("b.so", ...).

Под Windows я могу использовать GetModuleHandle("a.dll"), чтобы определить это, изучив возвращаемое значение. То есть, файл a.dll был загружен, если возвращаемое значение не равно нулю; иначе он еще не загружен.

Есть ли функция GetModuleHandle в Linux?

+0

Почему не логическая переменная, которую вы сами установили при загрузке 'a.so'? –

+0

@JoachimPileborg, a.so может быть загружен другими модулями, а не мной. – xmllmx

+0

Тогда почему бы просто не сделать 'b.so' зависеть от' a.so', поэтому система будет загружать 'a.so' автоматически при загрузке' b.so'? –

ответ

3

Вы можете использовать dlopen, чтобы проверить это, с RTLD_NOLOAD флагом:

Не загружайте библиотеку. Это может быть использовано для проверки, является ли библиотека уже резидентной (dlopen() возвращает NULL, если это не так, или дескриптор библиотеки, если он является резидентным).

+0

Большое спасибо, Joachim. Это именно то, что я ищу. – xmllmx

+0

@xmllmx Хотя этот вопрос правильно отвечает на оригинальный вопрос, сам вопрос показывает, что вы, вероятно, делаете что-то неправильно. –

3

определить, если a.so был загружен, прежде чем я называю dlopen

Это почти наверняка неправильно, что нужно делать (то есть вы просите неправильный вопрос).

Рассмотрите многопоточную программу, в которой вы задаете вышеуказанный вопрос (и получите положительный ответ) в потоке 1, точно так же, как поток 2 вызывает dlclose(a_so_handle) s и выгружает a.so.

И наоборот, вы можете получить отрицательный ответ в резьбе 1, точно так же, как резьба 2 заканчиваетdlopen("a.so", ...) и загружает ее.

Правильная вещь - просто делать dlopen("a.so", ...); dlopen("b.so", ...);.

Если a.so уже загружен, первый dlopen просто увеличит счетчик ссылок. Если он еще не загружен, это будет.

Но я все еще хочу знать состояние загрузки так во время выполнения.

Вы не можете видеть это состояние достоверно. Ответ, который вы получаете: a.so может быть или не быть загружен в настоящее время.

+0

Это также верно для Windows, кстати. –

0

Вы можете использовать dl_iterate_phdr.

#define _GNU_SOURCE 
#include <link.h> 

    int dl_iterate_phdr(
      int (*callback) (struct dl_phdr_info *info, 
           size_t size, void *data), 
      void *data); 

Обратный вызов принимает структуру dl_phdr_info, которая имеет член dlpi_name. Существует простой пример в dl_iterate_phdr (3).

Смежные вопросы