man*_*m-n 7 c linux assembly arm linux-kernel
我想写一个C程序,它会打印程序计数器的内容PC
.可以从用户空间或程序集中完成,还是使用某些特定的内核例程?
jxh*_*jxh 12
您应该能够通过使用ARM编译器工具链中的__current_pc()
内在函数来确定PC (ARM编译器支持许多与GCC相同的扩展).*这是ARM特有的:
int main () {
printf("%#x\n", __current_pc());
printf("%#x\n", __current_pc());
printf("%#x\n", __current_pc());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
*感谢FrankH.指出存在
__current_pc()
通常,PC在函数调用中被保存为返回地址.在具有GCC的非ARM Linux系统上,您可以调用__builtin_return_address(0)
以获取当前函数调用上下文的返回地址.以这种方式获得程序计数器会引起添加函数调用的惩罚,但它避免了内联汇编,因此这种技术可以移植到GCC支持的任何系统.
void * get_pc () { return __builtin_return_address(0); }
int main () {
printf("%p\n", get_pc());
printf("%p\n", get_pc());
printf("%p\n", get_pc());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在我的x86
系统上运行上述程序时,它会产生输出:
0x8048432
0x8048447
0x804845c
Run Code Online (Sandbox Code Playgroud)
拆解时gdb
:
Dump of assembler code for function main:
0x08048424 <+0>: push %ebp
0x08048425 <+1>: mov %esp,%ebp
0x08048427 <+3>: and $0xfffffff0,%esp
0x0804842a <+6>: sub $0x10,%esp
0x0804842d <+9>: call 0x804841c <get_pc>
0x08048432 <+14>: mov %eax,0x4(%esp)
0x08048436 <+18>: movl $0x8048510,(%esp)
0x0804843d <+25>: call 0x80482f0 <printf@plt>
0x08048442 <+30>: call 0x804841c <get_pc>
0x08048447 <+35>: mov %eax,0x4(%esp)
0x0804844b <+39>: movl $0x8048510,(%esp)
0x08048452 <+46>: call 0x80482f0 <printf@plt>
0x08048457 <+51>: call 0x804841c <get_pc>
0x0804845c <+56>: mov %eax,0x4(%esp)
0x08048460 <+60>: movl $0x8048510,(%esp)
0x08048467 <+67>: call 0x80482f0 <printf@plt>
0x0804846c <+72>: mov $0x0,%eax
0x08048471 <+77>: leave
0x08048472 <+78>: ret
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)
在ARM上,您可以使用:
static __inline__ void * get_pc(void) {
void *pc;
asm("mov %0, pc" : "=r"(pc));
return pc;
}
Run Code Online (Sandbox Code Playgroud)
或者这个应该也可以:
static __inline__ void * get_pc(void) {
register void * pc __asm__("pc");
__asm__("" : "=r"(pc));
return pc;
}
Run Code Online (Sandbox Code Playgroud)
强制内联在这里很重要,因为这可以确保您PC
根据呼叫站点进行检索.
编辑:刚才记得,__current_pc()
ARM内在.海湾合作委员会也应该这样做.
归档时间: |
|
查看次数: |
13239 次 |
最近记录: |