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_:返回的是当前指令指针的地址。