【问题标题】:Accessing .eh_frame data during execution在执行期间访问 .eh_frame 数据
【发布时间】:2013-08-08 03:22:29
【问题描述】:

我正在尝试从其中访问正在运行的程序的.eh_frame 部分的内容(具体来说,该程序是 Linux 内核 2.6.34.8)。 .eh_frame 包含用于异常处理的有用数据,我想在内核代码内部使用它。该部分已经由gcc 编写(readelf -a vmlinux.o 包含.eh_frame),问题是从代码中读取它。我很确定 elf 格式的文档说 .eh_frame 在代码执行期间是可访问的。

我查看了glibc 的来源以寻找.eh_frame 的用法,并在sysdeps/generic/sysdep.h 中找到了大多数CFA 指令的宏,但没有找到加载.eh_frame 数据的实际代码。

是否需要修改加载内核的过程以从文件中加载数据,或者.eh_frameinfo/.eh_frame_hdr段指针是否作为宏/汇编程序名称存储在某处(因此可以将其提取到C 变量)?

【问题讨论】:

    标签: kernel linux-kernel c glibc elf


    【解决方案1】:

    vmlinux.o 不是实际加载的内核。

    实际的内核映像(通常为 bzImage)不是 ELF 文件,仅包含运行内核所需的数据。

    此外,大多数内核都没有编译异常处理信息。

    【讨论】:

    • 谢谢。但是给定一个使用异常处理信息编译的内核,是否可以在运行时访问它(.eh_frame 数据)?如果有,怎么做?
    • 正如我所说,这些信息可能在vmlinux.o 中,但不在实际的内核映像中。
    • 因此,为了达到所需的效果,必须注入常规内核构建过程,收集所有 .eh_frame 数据以及代码中定义的符号,稍后将设置为指向注入内核映像的新创建的结构。然后该符号将用于访问在运行时收集的数据,对吧?
    • 是的,但是为什么您需要内核中的异常信息,以及像 2.6.34 这样的过时版本?
    • 我的一位老师给出的练习 :) 只是想确定我必须仔细研究内核构建过程的哪些步骤才能访问.eh_data。数据解析部分不会那么难,因为我已经修改了 ELF 文件并使用它们将库动态加载到程序中。 “将它们连接在一起,放入图像中并将定义的名称设置为指向创建的结构”部分看起来很有趣,并且一定会研究它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多