linux程序计数器,如何在C中打印程序计数器的确切值

news/2024/7/3 1:48:51

小编典典

您应该能够使用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;

}

*感谢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;

}

当我在x86系统上运行上述程序时,它将产生输出:

0x8048432

0x8048447

0x804845c

在拆卸时gdb:

Dump of assembler code for function main:

0x08048424 : push %ebp

0x08048425 : mov %esp,%ebp

0x08048427 : and $0xfffffff0,%esp

0x0804842a : sub $0x10,%esp

0x0804842d : call 0x804841c

0x08048432 : mov %eax,0x4(%esp)

0x08048436 : movl $0x8048510,(%esp)

0x0804843d : call 0x80482f0

0x08048442 : call 0x804841c

0x08048447 : mov %eax,0x4(%esp)

0x0804844b : movl $0x8048510,(%esp)

0x08048452 : call 0x80482f0

0x08048457 : call 0x804841c

0x0804845c : mov %eax,0x4(%esp)

0x08048460 : movl $0x8048510,(%esp)

0x08048467 : call 0x80482f0

0x0804846c : mov $0x0,%eax

0x08048471 : leave

0x08048472 : ret

End of assembler dump.

2020-06-03


http://lihuaxi.xjx100.cn/news/239138.html

相关文章

SpringMVC之请求参数的获取方式

转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求为GET和POST,get请求的参数在url上可以获取,post请求参数除了url上还…

javascript计时器_JavaScript计时器:您需要了解的一切

javascript计时器by Samer Buna通过Samer Buna JavaScript计时器:您需要了解的一切 (JavaScript Timers: Everything you need to know) A few weeks ago, I tweeted this interview question:几周前,我在推特上发布了这个面试问题: *** An…

红旗linux yum,更换红旗Linux: Asianux的yum源为网易源

测试环境:Linux系统版本Asianux4_x64:Linux localhost.localdomain 2.6.32-279.2.1.el6.x86_64 #1 SMP Tue Aug 14 11:42:24 CST 2012 x86_64 x86_64 x86_64 GNU/Linux本质上Asianux4_x64就是基于Redhat6企业版的。出现问题:安装完系统之后&a…

15. Python 函数

1. 函数的写法,函数的调用【函数的一般形式】定义一个函数要有以下规则:(1)函数代码块以 def 关键词开头,后接函数标识符名称和小括号();(2)任何传入参数和自…

glib 2.0 arm linux,glib源码安装使用方法

glib库是GTK和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义、相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动态调用…

解除微信回调的Activity必须在包名.wxapi下的限制

很久以前写过一篇文章:Android打包之多版本、多环境、多渠道。里面主要提到了将测试环境和正式环境的包分成不同的包名,同时安装在手机上,以便我们调试。同时,通过manifest的占位符,动态替换icon和label,让…

二次开发photoshop_Photoshop 101:Web开发人员简介

二次开发photoshop介绍 (Introduction) Often, when working as web developer, we need to integrate templates. They can be from Photoshop or other software. In this article, we will have a look at the basics of Photoshop for web developers.通常,在作…

基于web创建逼真的3D图形 | CSS技巧

在成为一名web开发者之前,我从事于视觉设计行业,创造屡获殊荣,电影和电视节目等高端3D效果,例如 Tron, The Thing, Resident Evil,和 Vikings 。为了能够创造这些效果,我们需要使用高度复杂的动画软件,例如…