欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现

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

2025/5/20 9:21:37 来源:https://blog.csdn.net/weixin_43412488/article/details/147561327  浏览:    关键词: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_:返回的是当前指令指针的地址。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词