From bef873e1f84686a57ba726669fe4a6c77cd245a6 Mon Sep 17 00:00:00 2001 From: mittorn Date: Wed, 8 Jul 2020 08:45:24 +0700 Subject: [PATCH] platform/android: enable dynamic dladdr, fix build --- common/defaults.h | 1 + engine/common/crashhandler.c | 18 ++++++++++++++++++ engine/platform/posix/lib_posix.c | 5 +++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/common/defaults.h b/common/defaults.h index 3a7e514d..b170817f 100644 --- a/common/defaults.h +++ b/common/defaults.h @@ -69,6 +69,7 @@ SETUP BACKENDS DEFINITIONS #endif // XASH_MESSAGEBOX #define XASH_USE_EVDEV + #define XASH_DYNAMIC_DLADDR #elif XASH_LINUX // we are building for Linux without SDL2, can draw only to framebuffer yet #ifndef XASH_VIDEO diff --git a/engine/common/crashhandler.c b/engine/common/crashhandler.c index ef07d184..baa227c2 100644 --- a/engine/common/crashhandler.c +++ b/engine/common/crashhandler.c @@ -243,6 +243,24 @@ void Sys_RestoreCrashHandler( void ) #include #include +#ifdef XASH_DYNAMIC_DLADDR +static int d_dladdr( void *sym, Dl_info *info ) +{ + static int (*dladdr_real) ( void *sym, Dl_info *info ); + + if( !dladdr_real ) + dladdr_real = dlsym( (void*)(size_t)(-1), "dladdr" ); + + memset( info, 0, sizeof( *info ) ); + + if( !dladdr_real ) + return -1; + + return dladdr_real( sym, info ); +} +#define dladdr d_dladdr +#endif + int printframe( char *buf, int len, int i, void *addr ) { Dl_info dlinfo; diff --git a/engine/platform/posix/lib_posix.c b/engine/platform/posix/lib_posix.c index 9aaa8576..de1d8f8a 100644 --- a/engine/platform/posix/lib_posix.c +++ b/engine/platform/posix/lib_posix.c @@ -198,20 +198,21 @@ void *COM_FunctionFromName( void *hInstance, const char *pName ) } #ifdef XASH_DYNAMIC_DLADDR -int d_dladdr( void *sym, Dl_info *info ) +static int d_dladdr( void *sym, Dl_info *info ) { static int (*dladdr_real) ( void *sym, Dl_info *info ); if( !dladdr_real ) dladdr_real = dlsym( (void*)(size_t)(-1), "dladdr" ); - Q_memset( info, 0, sizeof( *info ) ); + memset( info, 0, sizeof( *info ) ); if( !dladdr_real ) return -1; return dladdr_real( sym, info ); } +#define dladdr d_dladdr #endif const char *COM_NameForFunction( void *hInstance, void *function )