繁体   English   中英

Linux内核 - 为什么System.map中的函数地址是实时看到的地址之前的一个字节?

[英]Linux Kernel - why a function's address in System.map is one byte preceding its address as seen in real time?

在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地址位于c03441a0因此存在1个字节的偏移量。

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

我的猜测是你在Thumb模式下运行ARM,或者在使用函数指针底部位的其他一些架构上运行,以指示运行哪种模式。

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

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

在这些类型的体系结构上,指令必须始终为2或4字节对齐,这样底部位始终为零。 当架构发展为额外模式时,设计人员利用“浪费”位对模式进行编码。 它很聪明,但令人困惑,而且不只是为了你:很多软件,比如调试器,在最初发明时会以许多令人讨厌的方式破解。

对于习惯于任意随机对齐的可变长度指令的x86程序员来说,这个概念尤其令人困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM