1#if defined(__x86_64__) && defined(__linux__) 2 3#include "sanitizer_common/sanitizer_asm.h" 4 5.comm _ZN14__interception10real_vforkE,8,8 6.globl ASM_WRAPPER_NAME(vfork) 7ASM_TYPE_FUNCTION(ASM_WRAPPER_NAME(vfork)) 8ASM_WRAPPER_NAME(vfork): 9 // Store return address in the spill area and tear down the stack frame. 10 push %rcx 11 call COMMON_INTERCEPTOR_SPILL_AREA 12 pop %rcx 13 pop %rdi 14 mov %rdi, (%rax) 15 16 call *_ZN14__interception10real_vforkE(%rip) 17 18 // Restore return address from the spill area. 19 push %rcx 20 push %rax 21 call COMMON_INTERCEPTOR_SPILL_AREA 22 mov (%rax), %rdx 23 mov %rdx, 8(%rsp) 24 mov (%rsp), %rax 25 26 // Call handle_vfork in the parent process (%rax != 0). 27 test %rax, %rax 28 je .L_exit 29 30 lea 16(%rsp), %rdi 31 call COMMON_INTERCEPTOR_HANDLE_VFORK@PLT 32 33.L_exit: 34 pop %rax 35 ret 36ASM_SIZE(vfork) 37 38.weak vfork 39.set vfork, ASM_WRAPPER_NAME(vfork) 40 41#endif 42