Index: lib/sanitizer_common/sanitizer_linux_libcdep.cc =================================================================== --- lib/sanitizer_common/sanitizer_linux_libcdep.cc +++ lib/sanitizer_common/sanitizer_linux_libcdep.cc @@ -48,10 +48,6 @@ #include #endif -#if SANITIZER_ANDROID && __ANDROID_API__ < 21 -#include -#endif - #if !SANITIZER_ANDROID #include #include @@ -538,12 +534,9 @@ return rss * GetPageSizeCached(); } -// 64-bit Android targets don't provide the deprecated __android_log_write. -// Starting with the L release, syslog() works and is preferable to -// __android_log_write. #if SANITIZER_LINUX -#if SANITIZER_ANDROID +# if SANITIZER_ANDROID static atomic_uint8_t android_log_initialized; void AndroidLogInit() { @@ -554,35 +547,53 @@ static bool ShouldLogAfterPrintf() { return atomic_load(&android_log_initialized, memory_order_acquire); } -#else + +extern "C" SANITIZER_WEAK_ATTRIBUTE +int async_safe_write_log(int pri, const char* tag, const char* msg); +extern "C" SANITIZER_WEAK_ATTRIBUTE +int __android_log_write(int prio, const char* tag, const char* msg); + +// ANDROID_LOG_INFO is 4, but can't be resolved at runtime. +#define SANITIZER_ANDROID_LOG_INFO 4 + +// async_safe_write_log is basically __android_log_write but is only available +// in recent versions of Bionic. __android_log_write was deprecated along the +// way, so fallback to syslog if neither exists. The non-syslog alternatives +// do not allocate memory and are preferable. Also syslog is broken pre-L, this +// is another reason why we prefer __android_log_write if available. +void WriteOneLineToSyslog(const char *s) { + if (&async_safe_write_log) { + async_safe_write_log(SANITIZER_ANDROID_LOG_INFO, GetProcessName(), s); + } else if (&__android_log_write) { + __android_log_write(SANITIZER_ANDROID_LOG_INFO, nullptr, s); + } else { + syslog(LOG_INFO, "%s", s); + } +} + +extern "C" SANITIZER_WEAK_ATTRIBUTE +void android_set_abort_message(const char *); + +void SetAbortMessage(const char *str) { + if (&android_set_abort_message) + android_set_abort_message(str); +} +# else void AndroidLogInit() {} static bool ShouldLogAfterPrintf() { return true; } -#endif // SANITIZER_ANDROID -void WriteOneLineToSyslog(const char *s) { -#if SANITIZER_ANDROID &&__ANDROID_API__ < 21 - __android_log_write(ANDROID_LOG_INFO, NULL, s); -#else - syslog(LOG_INFO, "%s", s); -#endif -} +void WriteOneLineToSyslog(const char *s) { syslog(LOG_INFO, "%s", s); } + +void SetAbortMessage(const char *str) {} +# endif // SANITIZER_ANDROID void LogMessageOnPrintf(const char *str) { if (common_flags()->log_to_syslog && ShouldLogAfterPrintf()) WriteToSyslog(str); } -#if SANITIZER_ANDROID -extern "C" __attribute__((weak)) void android_set_abort_message(const char *); -void SetAbortMessage(const char *str) { - if (&android_set_abort_message) android_set_abort_message(str); -} -#else -void SetAbortMessage(const char *str) {} -#endif - -#endif // SANITIZER_LINUX +#endif // SANITIZER_LINUX } // namespace __sanitizer