vmlinux ELF查找给定结构的成员的偏移量

时间:2009-09-12 17:59:39

标签: linux elf

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

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

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

编辑:vmlinux适用于ARM,我可能无法始终在目标设备上运行C代码。

3 个答案:

答案 0 :(得分:2)

结构的大小和布局存在于编译对象文件的调试信息中(如果使用-g进行编译而不是strip)。

pahole(又名“poke-a-hole”,打包为Gentoo中的dev-util/dwarves)读取对象的DWARF调试信息,以输出结构中“洞”的信息 - 这可能是个好消息你的出发点。

答案 1 :(得分:1)

6.47 Offsetof

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 ++中,类型可能是依赖的。在任何一种情况下,成员都可以由单个标识符或成员访问序列和数组引用组成。

答案 2 :(得分:0)

使用arm-eabi-gdb找到了另一个解决方案 - 我可以执行print& init_task和print& init_task.pid,差异就是偏移量。