如何从库本身中获取共享库的路径?
换句话说,假设使用来加载库X dlopen()
,如何从库本身内部访问用于加载所述库的路径?
请注意,我不能首先将这个库加载到该库中。
更新: 这是使用静态变量的方法:
std::string wdir;
namespace {
class dynamic_library_load_unload_handler {
public:
dynamic_library_load_unload_handler(){
Dl_info dl_info;
dladdr((void *) NP_Initialize, &dl_info);
std::string path(dl_info.dli_fname);
wdir = path.substr( 0, path.find_last_of( '/' ) +1 );
}
~dynamic_library_load_unload_handler(){
// Code to execute when the library is unloaded
}
} dynamic_library_load_unload_handler_hook;
}
动态链接器实际上搜索几个位置以找到每个动态库。其中包括(来自man ld.so):
LD_LIBRARY_PATH
DT_RUNPATH
条目下的库如果要获取特定共享库的路径,建议使用此dladdr
功能。从手册页:
函数dladdr()使用函数指针,并尝试解析其所在的名称和文件。信息存储在
Dl_info
结构中:typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of nearest symbol with address lower than addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info;
如果找不到与符号匹配的地址,则将
dli_sname
和dli_saddr
设置为NULL
。
dladdr()
错误时返回0,成功时返回非零。
因此,您只给它一个函数指针,它将给您提供文件的名称以及其他信息。因此,例如,您可以在库中有一个构造函数,对其自身进行调用以找出库的完整路径:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
__attribute__((constructor))
void on_load(void) {
Dl_info dl_info;
dladdr((void *)on_load, &dl_info);
fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}
此功能也可以在具有相同语义的OS X上使用。
本文向大家介绍怎样动态加载路由?相关面试题,主要包含被问及怎样动态加载路由?时的应答技巧和注意事项,需要的朋友参考一下 vue-router的addRoutes方法
我将在我的Symfony 2应用程序中创建一个模块系统。每个模块都是一个捆绑包。 我不知道如何我可以动态(在我的服务代码)加载路由文件(例如。Acme某些ModuleBundle/Resources/config/routing.yml),并使用一些前缀(或主机)应用它们。就像在app/config/routing.yml中嵌入代码一样: 有什么解决办法吗?
本文向大家介绍Linux下动态链接库加载路径及搜索路径问题,包括了Linux下动态链接库加载路径及搜索路径问题的使用技巧和注意事项,需要的朋友参考一下 引子 近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题: “error while loading shared libraries” 这是是因为需要的动态库不在动态链接器ld.so的搜索路径导致。 ld.s
我有高塞拉操作系统-版本10.13.6 PHP版本:PHP 7.1.9 当我尝试做命令总是出现这样的错误: PHP启动:无法加载动态库'/usr/本地/php5-7.1.9-20170914-100859 /lib/php/extensions/no-debug-non-zts-20160303/imagick.so'-dlopens(/usr/本地/php5-7.1.9-20170914-100
我正在使用Ansible来设置EC2实例并部署一个应用程序。有一个hosts脚本,它收集标签、相关服务器和分组信息。我想把这些动作作为一个剧本来运行,所以 如果需要,将创建新实例 主机脚本加载清单(包括服务器的事实) 部署剧本有效 但我还没找到一个命令让它翻倍。