diff --git a/compiler-rt/lib/asan/asan_interface_internal.h b/compiler-rt/lib/asan/asan_interface_internal.h --- a/compiler-rt/lib/asan/asan_interface_internal.h +++ b/compiler-rt/lib/asan/asan_interface_internal.h @@ -179,6 +179,9 @@ SANITIZER_INTERFACE_ATTRIBUTE extern uptr __asan_shadow_memory_dynamic_address; + SANITIZER_INTERFACE_ATTRIBUTE + extern char __asan_shadow_memory; + // Global flag, copy of ASAN_OPTIONS=detect_stack_use_after_return SANITIZER_INTERFACE_ATTRIBUTE extern int __asan_option_detect_stack_use_after_return; diff --git a/compiler-rt/lib/asan/asan_mapping.h b/compiler-rt/lib/asan/asan_mapping.h --- a/compiler-rt/lib/asan/asan_mapping.h +++ b/compiler-rt/lib/asan/asan_mapping.h @@ -178,21 +178,28 @@ #if SANITIZER_FUCHSIA # define SHADOW_OFFSET (0) +# define SHADOW_OFFSET_STR "0" #elif SANITIZER_WORDSIZE == 32 # if SANITIZER_ANDROID # define SHADOW_OFFSET __asan_shadow_memory_dynamic_address # elif defined(__mips__) # define SHADOW_OFFSET kMIPS32_ShadowOffset32 +# define SHADOW_OFFSET_STR "0xaaa0000" # elif SANITIZER_FREEBSD # define SHADOW_OFFSET kFreeBSD_ShadowOffset32 +# define SHADOW_OFFSET_STR "0x40000000" # elif SANITIZER_NETBSD # define SHADOW_OFFSET kNetBSD_ShadowOffset32 +# define SHADOW_OFFSET_STR "0x40000000" # elif SANITIZER_WINDOWS # define SHADOW_OFFSET kWindowsShadowOffset32 +# define SHADOW_OFFSET_STR "0x30000000" # elif SANITIZER_IOS # define SHADOW_OFFSET __asan_shadow_memory_dynamic_address +# define SHADOW_OFFSET_STR "0" # else # define SHADOW_OFFSET kDefaultShadowOffset32 +# define SHADOW_OFFSET_STR "0x20000000" # endif #else # if SANITIZER_IOS @@ -200,27 +207,36 @@ # elif SANITIZER_MAC && defined(__aarch64__) # define SHADOW_OFFSET __asan_shadow_memory_dynamic_address #elif SANITIZER_RISCV64 -#define SHADOW_OFFSET kRiscv64_ShadowOffset64 +# define SHADOW_OFFSET kRiscv64_ShadowOffset64 +# define SHADOW_OFFSET_STR "0x55550000" # elif defined(__aarch64__) # define SHADOW_OFFSET kAArch64_ShadowOffset64 +# define SHADOW_OFFSET_STR "0" # elif defined(__powerpc64__) # define SHADOW_OFFSET kPPC64_ShadowOffset64 +# define SHADOW_OFFSET_STR "0" # elif defined(__s390x__) # define SHADOW_OFFSET kSystemZ_ShadowOffset64 +# define SHADOW_OFFSET_STR "0" # elif SANITIZER_FREEBSD # define SHADOW_OFFSET kFreeBSD_ShadowOffset64 +# define SHADOW_OFFSET_STR "0" # elif SANITIZER_NETBSD # define SHADOW_OFFSET kNetBSD_ShadowOffset64 +# define SHADOW_OFFSET_STR "0" # elif SANITIZER_MAC # define SHADOW_OFFSET kDefaultShadowOffset64 +# define SHADOW_OFFSET_STR "0" # elif defined(__mips64) -# define SHADOW_OFFSET kMIPS64_ShadowOffset64 +# define SHADOW_OFFSET kMIPS64_ShadowOffset64 +# define SHADOW_OFFSET_STR "0" #elif defined(__sparc__) #define SHADOW_OFFSET kSPARC64_ShadowOffset64 # elif SANITIZER_WINDOWS64 -# define SHADOW_OFFSET __asan_shadow_memory_dynamic_address +# define SHADOW_OFFSET __asan_shadow_memory_dynamic_address # else -# define SHADOW_OFFSET kDefaultShort64bitShadowOffset +# define SHADOW_OFFSET kDefaultShort64bitShadowOffset +# define SHADOW_OFFSET_STR "0x7fff8000" # endif #endif diff --git a/compiler-rt/lib/asan/asan_rtl.cpp b/compiler-rt/lib/asan/asan_rtl.cpp --- a/compiler-rt/lib/asan/asan_rtl.cpp +++ b/compiler-rt/lib/asan/asan_rtl.cpp @@ -36,6 +36,14 @@ int __asan_option_detect_stack_use_after_return; // Global interface symbol. uptr *__asan_test_only_reported_buggy_pointer; // Used only for testing asan. +// Defines a global pointer, which has SHADOW_OFFSET value. +#if defined(SHADOW_OFFSET_STR) +__asm( + ".section .bss ;" + ".globl __asan_shadow_memory ;" + ".set __asan_shadow_memory, " SHADOW_OFFSET_STR); +#endif + namespace __asan { uptr AsanMappingProfile[kAsanMappingProfileSize]; diff --git a/compiler-rt/lib/asan/tests/asan_noinst_test.cpp b/compiler-rt/lib/asan/tests/asan_noinst_test.cpp --- a/compiler-rt/lib/asan/tests/asan_noinst_test.cpp +++ b/compiler-rt/lib/asan/tests/asan_noinst_test.cpp @@ -270,3 +270,9 @@ } __asan_test_only_reported_buggy_pointer = 0; } + +#if defined(SHADOW_OFFSET_STR) +TEST(AddressSanitizerInternalInterface, TestShadowGlobalVar) { + EXPECT_EQ((char *)SHADOW_OFFSET, &__asan_shadow_memory); +} +#endif