From 1bde66492806d7ddc954123583aac1c518aea06d Mon Sep 17 00:00:00 2001 From: rtldg Date: Sun, 2 Mar 2025 09:21:59 +0000 Subject: [PATCH] Add some Linux64 stack alignment too --- extensions/dhooks/DynamicHooks/hook.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/extensions/dhooks/DynamicHooks/hook.cpp b/extensions/dhooks/DynamicHooks/hook.cpp index 4454ea37f..c0649b41c 100644 --- a/extensions/dhooks/DynamicHooks/hook.cpp +++ b/extensions/dhooks/DynamicHooks/hook.cpp @@ -363,6 +363,8 @@ void CHook::Write_ModifyReturnAddress(x64JitWriter& jit) // Shadow space 32 bytes + 8 bytes to keep it aligned on 16 bytes MSVC_ONLY(jit.sub(rsp, 40)); + // We need to keep it aligned to 16 bytes on Linux too... + GCC_ONLY(jit.sub(rsp, 8)); // 1st param (this) GCC_ONLY(jit.mov(rdi, reinterpret_cast(this))); @@ -380,6 +382,8 @@ void CHook::Write_ModifyReturnAddress(x64JitWriter& jit) jit.mov(rax, func.address); jit.call(rax); + // Free Linux stack alignemnt + GCC_ONLY(jit.add(rsp, 8)); // Free shadow space MSVC_ONLY(jit.add(rsp, 40)); @@ -419,12 +423,14 @@ void CHook::CreatePostCallback() // Shadow space 32 bytes + 8 bytes to keep it aligned on 16 bytes MSVC_ONLY(jit.sub(rsp, 40)); + // We need to keep it aligned to 16 bytes on Linux too... + GCC_ONLY(jit.sub(rsp, 8)); // 1st param (this) GCC_ONLY(jit.mov(rdi, reinterpret_cast(this))); MSVC_ONLY(jit.mov(rcx, reinterpret_cast(this))); - // 2n parameter (rsp) + // 2nd parameter (rsp) GCC_ONLY(jit.lea(rsi, rsp())); MSVC_ONLY(jit.lea(rdx, rsp(40))); @@ -432,6 +438,8 @@ void CHook::CreatePostCallback() jit.mov(rax, func.address); jit.call(rax); + // Free Linux stack alignemnt + GCC_ONLY(jit.add(rsp, 8)); // Free shadow space MSVC_ONLY(jit.add(rsp, 40)); @@ -452,6 +460,8 @@ void CHook::Write_CallHandler(x64JitWriter& jit, HookType_t type) // Shadow space 32 bytes + 8 bytes to keep it aligned on 16 bytes MSVC_ONLY(jit.sub(rsp, 40)); + // We need to keep it aligned to 16 bytes on Linux too... + GCC_ONLY(jit.sub(rsp, 8)); // Call the global hook handler @@ -466,6 +476,8 @@ void CHook::Write_CallHandler(x64JitWriter& jit, HookType_t type) jit.mov(rax, func.address); jit.call(rax); + // Free Linux stack alignemnt + GCC_ONLY(jit.add(rsp, 8)); // Free shadow space MSVC_ONLY(jit.add(rsp, 40)); }