diff --git a/lsplt/build.gradle.kts b/lsplt/build.gradle.kts index dceedca..f0e7bf0 100644 --- a/lsplt/build.gradle.kts +++ b/lsplt/build.gradle.kts @@ -101,6 +101,7 @@ android { "-DCMAKE_CXX_FLAGS_RELEASE=$configFlags", "-DCMAKE_C_FLAGS_RELEASE=$configFlags", "-DDEBUG_SYMBOLS_PATH=${project.buildDir.absolutePath}/symbols/$name", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" ) findInPath("ccache")?.let { println("Using ccache $it") diff --git a/lsplt/src/main/jni/lsplt.cc b/lsplt/src/main/jni/lsplt.cc index ed0e93c..bc1e4b5 100644 --- a/lsplt/src/main/jni/lsplt.cc +++ b/lsplt/src/main/jni/lsplt.cc @@ -15,11 +15,13 @@ #include "syscall.hpp" namespace { +const uintptr_t kPageSize = getpagesize(); -inline auto PageStart(uintptr_t addr) { return reinterpret_cast(((addr)&PAGE_MASK)); } +inline auto PageStart(uintptr_t addr) { + return reinterpret_cast(addr / kPageSize * kPageSize); } inline auto PageEnd(uintptr_t addr) { - return reinterpret_cast(reinterpret_cast(PageStart(addr)) + PAGE_SIZE); + return reinterpret_cast(reinterpret_cast(PageStart(addr)) + kPageSize); } struct RegisterInfo { @@ -113,7 +115,6 @@ public: } bool DoHook(uintptr_t addr, uintptr_t callback, uintptr_t *backup) { - using PAGE = std::array; LOGV("Hooking %p", reinterpret_cast(addr)); auto iter = lower_bound(addr); if (iter == end()) return false; @@ -139,9 +140,8 @@ public: } for (uintptr_t src = reinterpret_cast(backup_addr), dest = info.start, end = info.start + len; - dest < end; src += PAGE_SIZE, dest += PAGE_SIZE) { - static_assert(sizeof(PAGE) == PAGE_SIZE); - *reinterpret_cast(dest) = *reinterpret_cast(src); + dest < end; src += kPageSize, dest += kPageSize) { + memcpy(reinterpret_cast(dest), reinterpret_cast(src), kPageSize); } info.backup = reinterpret_cast(backup_addr); }