3

在 Linux 内核中,我需要找到使用的结构的成员变量的偏移量。例如,对于 task_struct 类型的 init_task,我想要它的 pid 和任务的偏移量。

为此,我只有 vmlinux。我可以参考开源内核代码,但它可能与我的构建有所不同。

是否可以在没有源的情况下获得偏移量?

编辑: vmlinux 用于 ARM,我可能并不总是能够在目标设备上运行 C 代码。

4

3 回答 3

2

结构的大小和布局存在于已编译目标文件的调试信息中(如果您使用-g和不编译strip)。

pahole(又名“poke-a-hole”,dev-util/dwarves在 Gentoo 中打包)读取对象的 DWARF 调试信息以输出有关结构中“孔”的信息——这对您来说可能是一个很好的起点。

于 2009-09-14T01:27:50.947 回答
1

6.47 偏移量

GCC 为 C 和 C++ 实现了一个语法扩展来实现 offsetof 宏。

 primary:
         "__builtin_offsetof" "(" typename "," offsetof_member_designator ")"

 offsetof_member_designator:
           identifier
         | offsetof_member_designator "." identifier
         | offsetof_member_designator "[" expr "]"

这个扩展就足够了

 #define offsetof(type, member)  __builtin_offsetof (type, member)

是 offsetof 宏的合适定义。在 C++ 中,类型可能是依赖的。在任何一种情况下,成员都可以由单个标识符或一系列成员访问和数组引用组成。

于 2009-09-12T18:19:38.740 回答
0

使用 arm-eabi-gdb 找到了另一个解决方案 - 我可以打印 &init_task 和打印 &init_task.pid ,区别在于偏移量。

于 2009-09-13T12:37:09.257 回答