diff --git a/reapi/build.gradle b/reapi/build.gradle index f45943f..0d8a81a 100644 --- a/reapi/build.gradle +++ b/reapi/build.gradle @@ -61,7 +61,7 @@ void setupToolchain(NativeBinarySpec b) { '_snprintf': 'snprintf' ]) - cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-msse2', '-fp-model fast=2', '-fomit-frame-pointer', '-inline-forceinline', '-fvisibility-inlines-hidden', '-fno-rtti', '-g0', '-s' + cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-msse2', '-fp-model fast=2', '-fomit-frame-pointer', '-inline-forceinline', '-fvisibility=default', '-fvisibility-inlines-hidden', '-fno-rtti', '-g0', '-s' } ToolchainConfigUtils.apply(project, cfg, b) diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 67a0c88..b52bbd9 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -123,7 +123,7 @@ void callVoidForward(size_t func, original_t original, f_args... args) hookctx_t hookCtx(sizeof...(args), args...); g_hookCtx = &hookCtx; - _callVoidForward(g_hookManager.getHook(func), original, args...); + _callVoidForward(g_hookManager.getHookFast(func), original, args...); g_hookCtx = nullptr; } @@ -186,7 +186,7 @@ R callForward(size_t func, original_t original, f_args... args) hookctx_t hookCtx(sizeof...(args), args...); g_hookCtx = &hookCtx; - auto ret = _callForward(g_hookManager.getHook(func), original, args...); + auto ret = _callForward(g_hookManager.getHookFast(func), original, args...); g_hookCtx = nullptr; return ret; diff --git a/reapi/src/hook_list.cpp b/reapi/src/hook_list.cpp index 28651d0..24df3e7 100644 --- a/reapi/src/hook_list.cpp +++ b/reapi/src/hook_list.cpp @@ -41,6 +41,18 @@ hook_t hooklist_player[] = { DLL(CBasePlayer_Observer_IsValidTarget), }; -const size_t hooklist_engine_size = arraysize(hooklist_engine); -const size_t hooklist_gamedll_size = arraysize(hooklist_gamedll); -const size_t hooklist_player_size = arraysize(hooklist_player); +hook_t* hooklist_t::getHookSafe(size_t hook) +{ + #define CASE(h) case ht_##h: if (index < arraysize(hooklist_##h)) return &hooklist_##h[index]; else break; + + const auto table = hooks_tables_e(hook / MAX_REGION_RANGE); + const auto index = hook & (MAX_REGION_RANGE - 1); + + switch (table) { + CASE(engine) + CASE(gamedll) + CASE(player) + } + + return nullptr; +} diff --git a/reapi/src/hook_list.h b/reapi/src/hook_list.h index 6de9107..bb46034 100644 --- a/reapi/src/hook_list.h +++ b/reapi/src/hook_list.h @@ -104,15 +104,12 @@ struct hook_t extern hook_t hooklist_engine[]; extern hook_t hooklist_gamedll[]; extern hook_t hooklist_player[]; -extern const size_t hooklist_engine_size; -extern const size_t hooklist_gamedll_size; -extern const size_t hooklist_player_size; struct hooklist_t { hook_t *operator[](size_t hook) const { -#define CASE(h) case ht_##h: if (index < hooklist_##h##_size) return &hooklist_##h[index]; else break; + #define CASE(h) case ht_##h: return &hooklist_##h[index]; const auto table = hooks_tables_e(hook / MAX_REGION_RANGE); const auto index = hook & (MAX_REGION_RANGE - 1); @@ -126,6 +123,8 @@ struct hooklist_t return nullptr; } + static hook_t *getHookSafe(size_t hook); + enum hooks_tables_e { ht_engine, diff --git a/reapi/src/hook_manager.cpp b/reapi/src/hook_manager.cpp index 6296562..579445d 100644 --- a/reapi/src/hook_manager.cpp +++ b/reapi/src/hook_manager.cpp @@ -39,7 +39,7 @@ void CHookManager::clearHandlers() const hook_t* CHookManager::getHook(size_t func) const { - return m_hooklist[func]; + return m_hooklist.getHookSafe(func); } CAmxxHook* CHookManager::getAmxxHook(cell handle) const diff --git a/reapi/src/hook_manager.h b/reapi/src/hook_manager.h index 7a31d80..cb9132e 100644 --- a/reapi/src/hook_manager.h +++ b/reapi/src/hook_manager.h @@ -34,6 +34,10 @@ public: hook_t* getHook(size_t func) const; CAmxxHook* getAmxxHook(cell hook) const; + hook_t* getHookFast(size_t func) const { + return m_hooklist[func]; + } + private: hooklist_t m_hooklist; }; diff --git a/shared_icc.gradle b/shared_icc.gradle index b4390f7..9fb7e9d 100644 --- a/shared_icc.gradle +++ b/shared_icc.gradle @@ -24,7 +24,7 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind -> linkerOptions: new GccToolchainConfig.LinkerOptions( interProceduralOptimizations: true, - stripSymbolTable: false, + stripSymbolTable: true, staticLibGcc: true, staticIntel: true, ),