dlopen в libc и libdl

Если программа, скомпилированная с помощью gcc, вызывает dlopen, она должна быть скомпилирована с включенной опцией -ldl. Это означает, что такая программа во время выполнения использует библиотеку libdl.so. На самом деле, выполнив ldd, мы видим строку:

libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2

libc.so, в свою очередь, использует dlopen (например, для работы с libnss.so), но выполнение ldd для libldl.so не отображается:

/lib64/ld-linux-x86-64.so.2 (0x00007f5a488e4000)
linux-vdso.so.1 =>  (0x00007fff7bdfe000)

Почему эта разница?


person badnack    schedule 01.07.2015    source источник


Ответы (1)


libdl предоставляет доступ только к частным функциям dl, которые уже существуют в libc, а также к некоторым оболочкам, чтобы немного упростить использование библиотек. Вы можете увидеть это поведение, взглянув на таблицу символов libdl.

Если вы используете readelf на libdl, ограничиваясь ЧАСТНЫМИ символами:

readelf -s /usr/lib/x86_64-linux-gnu/libdl.so | grep PRIVATE
    13: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  UND _rtld_global_ro@GLIBC_PRIVATE (7)
    14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _dl_vsym@GLIBC_PRIVATE (8)
    16: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _dl_addr@GLIBC_PRIVATE (8)
    18: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _dl_sym@GLIBC_PRIVATE (8)
    20: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _dl_rtld_di_serinfo@GLIBC_PRIVATE (7)
    25: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  UND _rtld_global@GLIBC_PRIVATE (7)
    34: 00000000002030c0     8 OBJECT  GLOBAL DEFAULT   27 _dlfcn_hook@@GLIBC_PRIVATE
    39: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  ABS GLIBC_PRIVATE

Вы видите все записи UND из GLIBC_PRIVATE? все они ссылаются на реализации в libc.

Определенный API самой libc не объявлен как реализующий функции dl в качестве открытого API, однако в glibc libdl тесно связан с libc и предоставляет известный API. В этом случае glibc может использовать внутренние подпрограммы для открытия и использования во время выполнения соответствующих .so файлов для nss подпрограмм.

person Petesh    schedule 01.07.2015