c - C共享库函数如何学习可执行文件的路径

标签 c executable filepath

我正在 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/

相关文章:

java - 转义文件路径中的空格

c - 请帮助 Pebble 智能 watch 编码新手尝试将时间转换为数字

c - 防止内核代码中的双 kfree?

c - 在C中的txt文件中搜索单词

c - 将三维数组传递给 C 中的函数

c - 将图标添加到 gcc 可执行文件并在终端中打开

android - 如何更改 Android SDK 管理器文件路径

windows-xp - 如何从Windows XP的批处理文件设置处理器关联性?

python - Pyinstaller onefile找不到数据文件

c# - 如何获取类库的当前目录?