Исходники glibc. функции загрузки *so библиотеки.

Модератор: Модераторы разделов

Ответить
zuuuuk
Сообщения: 13

Исходники glibc. функции загрузки *so библиотеки.

Сообщение zuuuuk »

Доброго времени суток.

Поясните , пожалуйста работу исходного кода glibc
Меня интересует реализация загрузки динамических библиотек.
Первое что нужно сделать для загрузки библиотеки это вызвать функцию

Код: Выделить всё

 dlopen (const char *file, int mode)


Эта функция вызывает код из glibc
https://sourceware.org/git/?p=glibc.git;a=b...f2f2fd3;hb=HEAD

Код: Выделить всё

  72
  73 void *
  74 __dlopen (const char *file, int mode DL_CALLER_DECL)
  75 {
  76 # ifdef SHARED
  77   if (__glibc_unlikely (_dlfcn_hook != NULL))
  78     return _dlfcn_hook->dlopen (file, mode, DL_CALLER);
  79 # endif
  80
  81
  ........

в этой функции вызывается функция через указатель.
структура _dlfcn_hook определена в файле
https://sourceware.org/git/?p=glibc.git;a=b...9734ad1;hb=HEAD

Код: Выделить всё

  89 struct dlfcn_hook
  90 {
  91   void *(*dlopen) (const char *file, int mode, void *dl_caller);
  92   int (*dlclose) (void *handle);
  93   void *(*dlsym) (void *handle, const char *name, void *dl_caller);
  94   void *(*dlvsym) (void *handle, const char *name, const char *version,
  95                    void *dl_caller);
  96   char *(*dlerror) (void);
  97   int (*dladdr) (const void *address, Dl_info *info);
  98   int (*dladdr1) (const void *address, Dl_info *info,
  99                   void **extra_info, int flags);
 100   int (*dlinfo) (void *handle, int request, void *arg, void *dl_caller);
 101   void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
 102   void *pad[4];
 103 };
 104
 105 extern struct dlfcn_hook *_dlfcn_hook;



Подскажите а где эта структура dlfcn_hook инициализируется ?
И где сама реализация _dlfcn_hook->dlopen (...); ?


Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Исходники glibc. функции загрузки *so библиотеки.

Сообщение s.xbatob »

Может и нигде. Тогда его значение NULL, а макрос __glibc_unlikely() на это прозрачно намекает.
Спасибо сказали:
Ответить