【问题标题】:Linux Get Shared Object Library Base Address In KernelLinux 在内核中获取共享对象库基址
【发布时间】:2022-11-17 01:20:37
【问题描述】:

我想在用户模式程序中获取 .so 文件的基址。我希望能够通过使用我的内核模块来获取该地址。在用户模式下,我通常使用grep [lib-name].so /proc/[pid]/maps | head -n 1 | cut -d "-" -f1

我知道我可以使用 kernel_read 直接读取文件,我知道 /proc 是一个提供内核数据的伪文件系统。所以我的问题是,是否有更简单的方法直接从内核获取该地址,或者是否有更好的 API 可用于访问/proc/[pid]/maps

【问题讨论】:

  • 我不认为你目前可以使用kernel_read来读取/proc/[pid]/maps,因为kernel_read需要read_iter文件操作,/proc/[pid]/maps没有提供。

标签: c linux module linux-kernel base-address


【解决方案1】:

不管能否阅读,/proc/[pid]/maps 不会给你任何信息,因为 (1) 它只显示用户空间虚拟地址(2) 内核模块不与任何任务关联,也没有自己的 PID。

但是,您可以更轻松地获取所需信息。 THIS_MODULE宏为您提供模块的struct module,加载后您可以访问->core_layout.base字段来了解模块基址:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int __init my_init(void)
{
        printk(KERN_INFO "Module " KBUILD_MODNAME " base address is: %px
",
                THIS_MODULE->core_layout.base);
        return 0;
}

module_init(my_init);

【讨论】:

  • 我想我没有很好地解释自己,在那种情况下我很抱歉。我想获取在用户模式进程中加载​​的用户模式模块的基址,该信息应该由我的内核模块获取。你的例子会让我得到我的内核模块的基址。
  • @Parvo 没有“用户模式模块”这样的东西,你需要更好地解释你想要实现的目标。您想要/proc/[pid]/maps 下列出的地址之一吗?到底是哪一个?为什么?
  • 我所说的模块是指由用户模式程序加载的库(以 .so 结尾的文件也称为共享对象)。
猜你喜欢
  • 2015-11-02
  • 1970-01-01
  • 2018-01-25
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多