我试图使用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函数中使用?
发布于 2021-06-07 18:58:37
,我是否错误地假设可执行文件的句柄可以像.so句柄一样在dlinfo函数中使用?
是的,你是。
动态链接器不知道主可执行文件是从哪个文件加载的。这是因为内核对主可执行文件执行所有的mmap
,并且只将文件描述符传递给动态加载器(后者的任务是加载其他必需的库并启动可执行文件的运行)。
我试图在linux上复制GetModuleFileName()的一些功能
没有可靠的方法可以做到这一点。事实上,可执行文件可能不再存在于磁盘上的任何地方--在程序仍在运行时运行可执行文件和删除可执行文件是非常好的。
此外,硬链接意味着可能有多个正确的答案--如果a.out
和b.out
是硬链接的话,没有一种简单的方法可以判断a.out
或b.out
是用来启动程序运行的。
最好的选择可能是阅读/proc/self/exe
,或者解析/proc/self/cmdline
和/或/proc/self/maps
。
发布于 2021-06-07 20:04:36
BSD实用程序库有一个函数getprogname(3),它完全可以满足您的需要。我建议在这种情况下,这比procfs更便于移植和使用。
https://stackoverflow.com/questions/67873850
复制相似问题