#if defined(__i386__) && defined(__linux__) #include "sanitizer_common/sanitizer_asm.h" .comm _ZN14__interception10real_vforkE,4,4 .globl ASM_WRAPPER_NAME(vfork) ASM_TYPE_FUNCTION(ASM_WRAPPER_NAME(vfork)) ASM_WRAPPER_NAME(vfork): _CET_ENDBR // Store return address in the spill area and tear down the stack frame. sub $12, %esp call COMMON_INTERCEPTOR_SPILL_AREA mov 12(%esp), %ecx mov %ecx, (%eax) add $16, %esp call .L0$pb .L0$pb: pop %eax .Ltmp0: add $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %eax call *_ZN14__interception10real_vforkE@GOTOFF(%eax) // Restore the stack frame. // 12(%esp) return address // 8(%esp) spill %ebx // 4(%esp) spill REAL(vfork) return value // (%esp) call frame (arg0) for __*_handle_vfork sub $16, %esp mov %ebx, 8(%esp) mov %eax, 4(%esp) // Form GOT address in %ebx. call .L1$pb .L1$pb: pop %ebx .Ltmp1: add $_GLOBAL_OFFSET_TABLE_+(.Ltmp1-.L1$pb), %ebx // Restore original return address. call COMMON_INTERCEPTOR_SPILL_AREA mov (%eax), %ecx mov %ecx, 12(%esp) mov 4(%esp), %eax // Call handle_vfork in the parent process (%rax != 0). test %eax, %eax je .L_exit lea 16(%esp), %ecx mov %ecx, (%esp) call COMMON_INTERCEPTOR_HANDLE_VFORK@PLT .L_exit: mov 4(%esp), %eax mov 8(%esp), %ebx add $12, %esp ret ASM_SIZE(vfork) .weak vfork .set vfork, ASM_WRAPPER_NAME(vfork) #endif