首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用dlopen()获取可执行文件路径

如何使用dlopen()获取可执行文件路径
EN

Stack Overflow用户
提问于 2021-06-07 14:48:14
回答 2查看 238关注 0票数 1

我试图使用dlopen()和dlinfo()来获取我的可执行文件路径。我可以使用dlopen()返回的句柄获得.so的路径,但是当我使用dlopen返回的句柄(NULL,RTLD_LAZY)时,返回的路径是空的。

代码语言:javascript
运行
复制
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函数中使用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-07 18:58:37

,我是否错误地假设可执行文件的句柄可以像.so句柄一样在dlinfo函数中使用?

是的,你是。

动态链接器不知道主可执行文件是从哪个文件加载的。这是因为内核对主可执行文件执行所有的mmap,并且只将文件描述符传递给动态加载器(后者的任务是加载其他必需的库并启动可执行文件的运行)。

我试图在linux上复制GetModuleFileName()的一些功能

没有可靠的方法可以做到这一点。事实上,可执行文件可能不再存在于磁盘上的任何地方--在程序仍在运行时运行可执行文件和删除可执行文件是非常好的。

此外,硬链接意味着可能有多个正确的答案--如果a.outb.out是硬链接的话,没有一种简单的方法可以判断a.outb.out是用来启动程序运行的。

最好的选择可能是阅读/proc/self/exe,或者解析/proc/self/cmdline和/或/proc/self/maps

票数 2
EN

Stack Overflow用户

发布于 2021-06-07 20:04:36

BSD实用程序库有一个函数getprogname(3),它完全可以满足您的需要。我建议在这种情况下,这比procfs更便于移植和使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67873850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档