Index: lib/sanitizer_common/sanitizer_linux_libcdep.cc =================================================================== --- lib/sanitizer_common/sanitizer_linux_libcdep.cc +++ lib/sanitizer_common/sanitizer_linux_libcdep.cc @@ -48,6 +48,10 @@ #include #endif +#if SANITIZER_ANDROID && __ANDROID_API__ < 21 +#include +#endif + #if !SANITIZER_ANDROID #include #include @@ -532,9 +536,12 @@ 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() { @@ -545,53 +552,35 @@ static bool ShouldLogAfterPrintf() { return atomic_load(&android_log_initialized, memory_order_acquire); } - -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 +#else void AndroidLogInit() {} static bool ShouldLogAfterPrintf() { return true; } +#endif // SANITIZER_ANDROID -void WriteOneLineToSyslog(const char *s) { syslog(LOG_INFO, "%s", s); } - -void SetAbortMessage(const char *str) {} -# 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 LogMessageOnPrintf(const char *str) { if (common_flags()->log_to_syslog && ShouldLogAfterPrintf()) WriteToSyslog(str); } -#endif // SANITIZER_LINUX +#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 } // namespace __sanitizer