当前位置: 首页 > news >正文

linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现

本文探讨了Linux环境下两个特殊的宏,_RET_IP_和_THIS_IP_,它们分别用于获取当前函数的返回地址和当前指令指针的地址。

1、宏定义

我们先看它们的宏定义

include./linux/kernel.h#define _RET_IP_		(unsigned long)__builtin_return_address(0)#define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })

2、测试

下面我们写个简单的程序测试下

#include <stdio.h>
#include <stdlib.h>#define _RET_IP_	(unsigned long)__builtin_return_address(0)#define _THIS_IP_  	({ __label__ __here; __here: (unsigned long)&&__here; })void bar(void)
{/*This is bar (400638,400608) */printf("This is bar (%x,%x) \012",_RET_IP_,_THIS_IP_);return ;
}int main()
{bar();return 0;
}

上面程序输出结果是:This is bar (400638,400608)

我们将上面程序反汇编结果如下:

objdump -S xxx > xx.Stest_retip:     file format elf64-littleaarch64Disassembly of section .init:0000000000400440 <_init>:400440:       a9bf7bfd        stp     x29, x30, [sp, #-16]!400444:       910003fd        mov     x29, sp400448:       94000032        bl      400510 <call_weak_fn>40044c:       a8c17bfd        ldp     x29, x30, [sp], #16400450:       d65f03c0        retDisassembly of section .plt:0000000000400460 <.plt>:400460:       a9bf7bf0        stp     x16, x30, [sp, #-16]!400464:       90000090        adrp    x16, 410000 <__FRAME_END__+0xf788>400468:       f947fe11        ldr     x17, [x16, #4088]40046c:       913fe210        add     x16, x16, #0xff8400470:       d61f0220        br      x17400474:       d503201f        nop400478:       d503201f        nop40047c:       d503201f        nop0000000000400480 <__libc_start_main@plt>:400480:       b0000090        adrp    x16, 411000 <__libc_start_main@GLIBC_2.17>400484:       f9400211        ldr     x17, [x16]400488:       91000210        add     x16, x16, #0x040048c:       d61f0220        br      x170000000000400490 <__gmon_start__@plt>:400490:       b0000090        adrp    x16, 411000 <__libc_start_main@GLIBC_2.17>400494:       f9400611        ldr     x17, [x16, #8]400498:       91002210        add     x16, x16, #0x840049c:       d61f0220        br      x1700000000004004a0 <abort@plt>:4004a0:       b0000090        adrp    x16, 411000 <__libc_start_main@GLIBC_2.17>4004a4:       f9400a11        ldr     x17, [x16, #16]4004a8:       91004210        add     x16, x16, #0x104004ac:       d61f0220        br      x1700000000004004b0 <printf@plt>:4004b0:       b0000090        adrp    x16, 411000 <__libc_start_main@GLIBC_2.17>4004b4:       f9400e11        ldr     x17, [x16, #24]4004b8:       91006210        add     x16, x16, #0x184004bc:       d61f0220        br      x17Disassembly of section .text:00000000004004c0 <_start>:4004c0:       d280001d        mov     x29, #0x0                       // #04004c4:       d280001e        mov     x30, #0x0                       // #04004c8:       aa0003e5        mov     x5, x04004cc:       f94003e1        ldr     x1, [sp]4004d0:       910023e2        add     x2, sp, #0x84004d4:       910003e6        mov     x6, sp4004d8:       d2e00000        movz    x0, #0x0, lsl #484004dc:       f2c00000        movk    x0, #0x0, lsl #324004e0:       f2a00800        movk    x0, #0x40, lsl #164004e4:       f280c580        movk    x0, #0x62c4004e8:       d2e00003        movz    x3, #0x0, lsl #484004ec:       f2c00003        movk    x3, #0x0, lsl #324004f0:       f2a00803        movk    x3, #0x40, lsl #164004f4:       f280c903        movk    x3, #0x6484004f8:       d2e00004        movz    x4, #0x0, lsl #484004fc:       f2c00004        movk    x4, #0x0, lsl #32400500:       f2a00804        movk    x4, #0x40, lsl #16400504:       f280d904        movk    x4, #0x6c8400508:       97ffffde        bl      400480 <__libc_start_main@plt>40050c:       97ffffe5        bl      4004a0 <abort@plt>0000000000400510 <call_weak_fn>:400510:       90000080        adrp    x0, 410000 <__FRAME_END__+0xf788>400514:       f947f000        ldr     x0, [x0, #4064]400518:       b4000040        cbz     x0, 400520 <call_weak_fn+0x10>40051c:       17ffffdd        b       400490 <__gmon_start__@plt>400520:       d65f03c0        ret0000000000400524 <deregister_tm_clones>:400524:       b0000080        adrp    x0, 411000 <__libc_start_main@GLIBC_2.17>400528:       9100c001        add     x1, x0, #0x3040052c:       b0000080        adrp    x0, 411000 <__libc_start_main@GLIBC_2.17>400530:       9100c000        add     x0, x0, #0x30400534:       eb00003f        cmp     x1, x0400538:       54000160        b.eq    400564 <deregister_tm_clones+0x40>  // b.none40053c:       d10043ff        sub     sp, sp, #0x10400540:       90000001        adrp    x1, 400000 <_init-0x440>400544:       f9437421        ldr     x1, [x1, #1768]400548:       f90007e1        str     x1, [sp, #8]40054c:       b4000081        cbz     x1, 40055c <deregister_tm_clones+0x38>400550:       aa0103f0        mov     x16, x1400554:       910043ff        add     sp, sp, #0x10400558:       d61f0200        br      x1640055c:       910043ff        add     sp, sp, #0x10400560:       d65f03c0        ret400564:       d65f03c0        ret0000000000400568 <register_tm_clones>:400568:       b0000080        adrp    x0, 411000 <__libc_start_main@GLIBC_2.17>40056c:       9100c001        add     x1, x0, #0x30400570:       b0000080        adrp    x0, 411000 <__libc_start_main@GLIBC_2.17>400574:       9100c000        add     x0, x0, #0x30400578:       cb000021        sub     x1, x1, x040057c:       d2800042        mov     x2, #0x2                        // #2400580:       9343fc21        asr     x1, x1, #3400584:       9ac20c21        sdiv    x1, x1, x2400588:       b4000161        cbz     x1, 4005b4 <register_tm_clones+0x4c>40058c:       d10043ff        sub     sp, sp, #0x10400590:       90000002        adrp    x2, 400000 <_init-0x440>400594:       f9437842        ldr     x2, [x2, #1776]400598:       f90007e2        str     x2, [sp, #8]40059c:       b4000082        cbz     x2, 4005ac <register_tm_clones+0x44>4005a0:       aa0203f0        mov     x16, x24005a4:       910043ff        add     sp, sp, #0x104005a8:       d61f0200        br      x164005ac:       910043ff        add     sp, sp, #0x104005b0:       d65f03c0        ret4005b4:       d65f03c0        ret00000000004005b8 <__do_global_dtors_aux>:4005b8:       a9be7bfd        stp     x29, x30, [sp, #-32]!4005bc:       910003fd        mov     x29, sp4005c0:       f9000bf3        str     x19, [sp, #16]4005c4:       b0000093        adrp    x19, 411000 <__libc_start_main@GLIBC_2.17>4005c8:       3940c260        ldrb    w0, [x19, #48]4005cc:       35000080        cbnz    w0, 4005dc <__do_global_dtors_aux+0x24>4005d0:       97ffffd5        bl      400524 <deregister_tm_clones>4005d4:       52800020        mov     w0, #0x1                        // #14005d8:       3900c260        strb    w0, [x19, #48]4005dc:       f9400bf3        ldr     x19, [sp, #16]4005e0:       a8c27bfd        ldp     x29, x30, [sp], #324005e4:       d65f03c0        ret00000000004005e8 <frame_dummy>:4005e8:       17ffffe0        b       400568 <register_tm_clones>00000000004005ec <bar>:4005ec:       a9bf7bfd        stp     x29, x30, [sp, #-16]!4005f0:       910003fd        mov     x29, sp4005f4:       aa1e03e0        mov     x0, x304005f8:       aa0003fe        mov     x30, x04005fc:       d50320ff        xpaclri400600:       aa1e03e0        mov     x0, x30400604:       aa0003e1        mov     x1, x0400608:       90000000        adrp    x0, 400000 <_init-0x440>40060c:       91182000        add     x0, x0, #0x608400610:       aa0003e2        mov     x2, x0400614:       90000000        adrp    x0, 400000 <_init-0x440>400618:       911be000        add     x0, x0, #0x6f840061c:       97ffffa5        bl      4004b0 <printf@plt>400620:       d503201f        nop400624:       a8c17bfd        ldp     x29, x30, [sp], #16400628:       d65f03c0        ret000000000040062c <main>:40062c:       a9bf7bfd        stp     x29, x30, [sp, #-16]!400630:       910003fd        mov     x29, sp400634:       97ffffee        bl      4005ec <bar>400638:       52800000        mov     w0, #0x0                        // #040063c:       a8c17bfd        ldp     x29, x30, [sp], #16400640:       d65f03c0        ret400644:       d503201f        nop0000000000400648 <__libc_csu_init>:400648:       a9bc7bfd        stp     x29, x30, [sp, #-64]!40064c:       910003fd        mov     x29, sp400650:       a90153f3        stp     x19, x20, [sp, #16]400654:       90000094        adrp    x20, 410000 <__FRAME_END__+0xf788>400658:       9137c294        add     x20, x20, #0xdf040065c:       a9025bf5        stp     x21, x22, [sp, #32]400660:       90000095        adrp    x21, 410000 <__FRAME_END__+0xf788>400664:       9137a2b5        add     x21, x21, #0xde8400668:       cb150294        sub     x20, x20, x2140066c:       2a0003f6        mov     w22, w0400670:       a90363f7        stp     x23, x24, [sp, #48]400674:       aa0103f7        mov     x23, x1400678:       aa0203f8        mov     x24, x240067c:       97ffff71        bl      400440 <_init>400680:       eb940fff        cmp     xzr, x20, asr #3400684:       54000160        b.eq    4006b0 <__libc_csu_init+0x68>  // b.none400688:       9343fe94        asr     x20, x20, #340068c:       d2800013        mov     x19, #0x0                       // #0400690:       f8737aa3        ldr     x3, [x21, x19, lsl #3]400694:       aa1803e2        mov     x2, x24400698:       91000673        add     x19, x19, #0x140069c:       aa1703e1        mov     x1, x234006a0:       2a1603e0        mov     w0, w224006a4:       d63f0060        blr     x34006a8:       eb13029f        cmp     x20, x194006ac:       54ffff21        b.ne    400690 <__libc_csu_init+0x48>  // b.any4006b0:       a94153f3        ldp     x19, x20, [sp, #16]4006b4:       a9425bf5        ldp     x21, x22, [sp, #32]4006b8:       a94363f7        ldp     x23, x24, [sp, #48]4006bc:       a8c47bfd        ldp     x29, x30, [sp], #644006c0:       d65f03c0        ret4006c4:       d503201f        nop00000000004006c8 <__libc_csu_fini>:4006c8:       d65f03c0        retDisassembly of section .fini:00000000004006cc <_fini>:4006cc:       a9bf7bfd        stp     x29, x30, [sp, #-16]!4006d0:       910003fd        mov     x29, sp4006d4:       a8c17bfd        ldp     x29, x30, [sp], #164006d8:       d65f03c0        ret

_RET_IP_:返回的是当前函数的返回地址,当前函数的返回地址保存在X30寄存器(LR寄存器)中(调用bl指令将返回地址保存在X30寄存器中,X30保存的是PC+4)。

_THIS_IP_:返回的是当前指令指针的地址。

相关文章:

  • 第15节:传统分类模型-K近邻(KNN)算法
  • 【文献速递】snoRNA-SNORD113-3/ADAR2通过对PHKA2的A-to-I编辑影响胶质母细胞瘤糖脂代谢
  • Nginx配置文件介绍
  • 创建一个springboot的项目-简洁步骤
  • 【前端基础】viewport 元标签的详细参数解析与实战指南
  • 【项目实训个人博客】multi-agent调研(1)
  • DES密码系统的差分分析
  • DLNA 功能
  • LINUX427 冒险位 粘滞位 chmod 权限
  • 杭州小红书代运营公司-品融电商:专业赋能品牌社交增长
  • Leetcode837.新21点
  • OpenCV彩色图像分割
  • 突破常规:探索无 get 方法类设计的独特魅力
  • 互联网大厂Java面试实录:从Spring Boot到微服务架构的技术问答
  • 硬件工程师面试常见问题(9)
  • 使用 Cherry Studio 调用高德 MCP 服务
  • 【SpringMVC文件上传终极指南:从基础配置到云存储集成】
  • 一、对printk的使用记录
  • 北峰专业数字集群通信系统:构建消防指挥调度的智能化基石
  • 游戏遭遇DDoS攻击如何快速止损?实战防御策略与应急响应指南
  • 工信部:加快自动驾驶系统安全要求强制性国家标准研制
  • 上海第三家“胖永辉”在浦东开业,设立了外贸产品专区
  • 《沙尘暴》:用贴近生活的影像和表演拍摄悬疑剧
  • 宣称防老年痴呆的“原装进口”保健品McPee被指涉假,未获澳方销售批准
  • 地下管道密布成难题,道路修整如何破局?
  • “90后”高层建筑返青春:功能调整的技术路径和运营考验