[英]Kernel sys_call_table address does not match address specified in 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.