我想使用dlopen函数从程序中加载一些依赖库。是否可以知道这些库的实际位置?
例如,ldd显示系统中所有具有路径的从属库。它是如何工作的?是否可以通过C ++代码中的某些调用来获取我需要用dlopen加载的对应库的路径?
答案 0 :(得分:1)
从man dlopen
可以看到:
函数dlopen()加载以空字符串结尾的文件名命名的动态库文件,并为动态库返回一个不透明的“句柄”。如果filename为NULL,则返回的句柄用于主程序。如果filename包含斜杠(“ /”),则将其解释为(相对或绝对)路径名。否则,动态链接程序如下搜索该库(有关更多详细信息,请参见ld.so(8)):
(仅限ELF),如果调用程序的可执行文件包含DT_RPATH标记,但不包含DT_RUNPATH标记,则将搜索DT_RPATH标记中列出的目录。
如果在启动程序时将环境变量
LD_LIBRARY_PATH
定义为包含用冒号分隔的目录列表,则将搜索这些目录。 (作为安全措施,set-user-ID和set-group-ID程序会忽略此变量。)(仅限ELF),如果调用程序的可执行文件包含DT_RUNPATH标记,则将搜索该标记中列出的目录。
检查缓存文件
/etc/ld.so.cache
(由ldconfig(8)维护)以查看其是否包含文件名条目。搜索目录
/lib
和/usr/lib
(按此顺序)。
因此,如果“安装”了所需的库,则将执行简单的dlopen("foobar.so", flag)
。