【发布时间】:2014-04-17 02:30:01
【问题描述】:
我正在 Linux 中编写一个 C 共享库,其中一个函数想要发现当前运行的可执行文件的路径。它无法访问 main() 中的 argv[0],我不想要求访问库的程序将其传入。
这样的函数如何在 main() 之外和在野外找到正在运行的可执行文件的路径?到目前为止,我想到了 2 种相当不可移植、不可靠的方法:1) 尝试读取 /proc/getpid()/exe 和 2) 尝试将堆栈爬升到 __libc_start_main() 并读取堆栈参数。我担心所有安装了 /proc 的机器。
你能想出别的办法吗?在 dlopen(NULL, 0) 的任何地方都埋有什么东西吗?我可以从内核中获得可靠的 self proc 映像吗??
感谢您的任何想法。
【问题讨论】:
-
很可能 argv[0] 无论如何都不是一种可靠的方法,因为那里给出的名称可能与当前工作目录在进程开始时相关
-
请注意,并非所有非 Linux 系统都有
/proc(例如 Mac OS X 没有它),并且那些不一定具有与 Linux 相同的结构(例如 Solaris,在至少在旧版本中)。
标签: c executable filepath