【问题标题】:How to determine the memory address range of Linux-Kernel objects如何确定 Linux-Kernel 对象的内存地址范围
【发布时间】:2021-07-17 20:46:39
【问题描述】:

我想检查 kernel/bpf/verifier.c 中的函数加载到的内存。 在编译到 verifier.o 之后,该对象被链接到内核中。在 /proc/kallsyms 中只列出了非静态函数。但是我想要该 c 文件中定义的所有函数的地址。如果 kaslr 关闭,它们应该按顺序位于内核空间中还是?

如果是,有没有办法确定地址范围?

谢谢

【问题讨论】:

  • 只是一个想法:你能printk 使用&function_name 获得该文件中每个函数的地址吗?
  • 我可以,但是文件很大(13k 行),这不会缩放,也不会给我函数的大小。我正在寻找一种更通用的方式。这里的大多数功能也是静态的。并且为它编写代码可能会变得肮脏和不稳定
  • 另一个想法:this answer 可能会在 kallsyms 中为您提供更多信息(尽管仍然不确定它是否涵盖了您想要的所有内容,我正在寻找)。
  • 是的,我已经看过这篇文章了。我试图编译没有内联标志的 bpf 子系统,但我想这是不成功的(将它附加到 kernel/bpf 目录中 makefile 的 cflags 中)。但是,如果编译成功并且没有内联,则此方法也不起作用。也许我尝试使用 Kernel 选项,但回复表明它只影响非静态变量而不影响函数。
  • 目前我能想到的唯一其他选择是读取/boot/ 目录中的System.map 文件。

标签: linux linux-kernel kernel memory-alignment memory-layout


【解决方案1】:

针对我的特定问题的解决方案是使用debug_info=y 编译内核并使用readelf -Ws vmlinux 从大型vmlinux 二进制文件中获取地址范围

但是,内核需要在编译时在配置中关闭 nokalsr 或 kalsr 进行引导。

【讨论】:

    猜你喜欢
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2012-09-05
    • 2014-01-30
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多