Если программа, скомпилированная с помощью 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)
Почему эта разница?