一尘不染

Linux内核-实时查看为什么System.map中的函数地址比其地址早一个字节?

linux

在linux内核源代码中,在tasklet_action代码中添加了以下几行:

printk("tasklet_action = %p\n" , *tasklet_action);
printk("tasklet_action = %p\n" , &tasklet_action);
printk("tasklet_action = %p\n" , tasklet_action);

在输出中,我得到:

tasklet_action = c03441a1
tasklet_action = c03441a1
tasklet_action = c03441a1

但是在system.map文件中搜索tasklet_action地址时,地址为c03441a01字节。

  • 为什么会有这个偏移量?
  • 它总是偏移一个字节吗?

阅读 628

收藏
2020-06-07

共1个答案

一尘不染

我的猜测是您正在 以Thumb模式 在ARM 上运行 ,或者在其他使用功能指针的最低位指示运行模式的体系结构上运行。

如果是这样,答案是您的函数 确实位于system.map中的地址

您在运行时获得的值是位置 和模式

在这类架构上,指令必须始终对齐2或4字节,这将使最低位始终为零。当体系结构增加了额外的模式时,设计人员利用“浪费”位对模式进行编码。这很聪明,但很困惑,而且不仅仅针对您:初次发明时,许多软件(例如调试器)以许多讨厌的方式损坏。

对于习惯于使用任意随机对齐方式来可变长度指令的x86程序员而言,此概念尤其令人困惑。

2020-06-07