diff --git a/source/src/Makefile b/source/src/Makefile index bf061958e1..2c70786cec 100644 --- a/source/src/Makefile +++ b/source/src/Makefile @@ -39,6 +39,11 @@ ifneq (,$(findstring clang,$(CXX))) else CXXFLAGS= -O3 -fomit-frame-pointer override CXXFLAGS+= -Wall -fsigned-char -ffast-math -rdynamic -Wno-format-zero-length + + ifneq ($(wildcard /usr/include/execinfo.h),) + override CXXFLAGS+= -DHAS_EXECINFO + endif + ifeq "$(shell expr 'gcc -dumpversion' \>= 8)" "1" override CXXFLAGS+= -Wno-stringop-truncation endif diff --git a/source/src/tools.cpp b/source/src/tools.cpp index 75a5128d01..004006d16e 100644 --- a/source/src/tools.cpp +++ b/source/src/tools.cpp @@ -381,7 +381,10 @@ void stackdumper(unsigned int type, EXCEPTION_POINTERS *ep) } #elif defined(linux) || defined(__linux) || defined(__linux__) +// Add support for musl systems (eg., alpine, void) +#if defined(HAS_EXECINFO) #include +#endif // stack dumping on linux, inspired by Sachin Agrawal's sample code @@ -389,6 +392,7 @@ struct signalbinder { static void stackdumper(int sig) { +#if defined(HAS_EXECINFO) printf("stacktrace:\n"); #if !defined(STANDALONE) if(clientlogfile) clientlogfile->printf("stacktrace\n"); @@ -397,6 +401,7 @@ struct signalbinder void *array[BTSIZE]; int n = backtrace(array, BTSIZE); char **symbols = backtrace_symbols(array, n); + for(int i = 0; i < n; i++) { printf("%s\n", symbols[i]); @@ -404,10 +409,12 @@ struct signalbinder if(clientlogfile) clientlogfile->printf("%s\n", symbols[i]); #endif } - free(symbols); + free(symbols); +#else + printf("Stacktrace not available!\n"); +#endif fatal("AssaultCube error (%d)", sig); - } signalbinder()