我正在 Linux 中编写一个 C 共享库,其中一个函数想要发现当前运行的可执行文件的路径。它无法访问 main() 中的 argv[0],我不想要求访问库的程序将其传入。
像这样的函数,在 main() 之外并且在野外,如何才能到达正在运行的可执行文件的路径?到目前为止,我想到了 2 种相当不可移植、不可靠的方法:1) 尝试读取/proc/getpid()/exe 和 2) 尝试将堆栈爬升到 __libc_start_main() 并读取堆栈参数。我担心所有安装了/proc 的机器。
你能想出别的办法吗? dlopen(NULL, 0) 中的任何地方都埋着什么东西吗?我可以从内核中获取可靠的 self 进程镜像吗??
感谢您的任何想法。
最佳答案
/proc
是最好的机会,因为“可执行文件的路径”在 Linux 中并不是定义明确的概念(您甚至可以在程序运行时删除它)。
要获得加载模块的分解(主要可执行文件通常是第一个条目),您应该查看 /proc/<pid>/maps
.这是一个文本格式的文件,允许您将可执行文件和库路径与加载地址相关联(如果前者已知且仍然有效)。
关于c - C共享库函数如何学习可执行文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23123549/