【发布时间】:2021-08-24 16:04:03
【问题描述】:
我正在尝试使用 dlopen() 和 dlinfo() 来获取我的可执行文件的路径。我可以通过使用 dlopen() 返回的句柄来获取 .so 的路径,但是当我使用 dlopen(NULL,RTLD_LAZY); 返回的句柄时那么我回来的路是空的。
void* executable_handle = dlopen(0, RTLD_LAZY);
if (nullptr != executable_handle)
{
char pp_linkmap[sizeof(link_map)];
int r = dlinfo(executable_handle, RTLD_DI_LINKMAP, pp_linkmap);
if (0 == r)
{
link_map* plink = *(link_map**)pp_linkmap;
printf("path: %s\n", plink->l_name);
}
}
我认为可执行文件的句柄可以像使用 .so 句柄一样在 dlinfo 函数中使用是错误的吗?
【问题讨论】:
-
我不知道如何获取实际可执行文件的路径,但我认为您使用
char[]作为dlinfo的参数会使它复杂化一点。 suggested fix -
为什么不使用
argv[0]? -
这将在库中调用,而不是从可执行文件本身调用。我无权访问 argv[0]。您可能会争辩说,如果可执行文件希望使用该路径,则应该使用 argv[0] ,但我无法控制。我正在尝试在 linux 上复制 GetModuleFileName() 的一些功能。