diff --git a/compiler-rt/lib/scudo/standalone/CMakeLists.txt b/compiler-rt/lib/scudo/standalone/CMakeLists.txt --- a/compiler-rt/lib/scudo/standalone/CMakeLists.txt +++ b/compiler-rt/lib/scudo/standalone/CMakeLists.txt @@ -38,7 +38,15 @@ # We don't use the C++ standard library, so avoid including it by mistake. append_list_if(COMPILER_RT_HAS_NOSTDLIBXX_FLAG -nostdlib++ SCUDO_LINK_FLAGS) -append_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none SCUDO_LINK_FLAGS) +# On ARM, we must link against default unwind lib when GWPAsan is used, +# otherwise we get undefined references to __aeabi_unwind_cpp_pr* symbols. +# This is because object files compiled with -funwind-tables end up referencing +# these symbols on ARM, while on other architectures, such as x86_64 and +# AArch64, only the .eh_frame section is added, but no references to an unwind +# library are made. +if(NOT COMPILER_RT_HAS_GWP_ASAN OR NOT "${LLVM_NATIVE_ARCH}" STREQUAL "ARM") + append_list_if(CXX_SUPPORTS_UNWINDLIB_NONE_FLAG --unwindlib=none SCUDO_LINK_FLAGS) +endif() if(COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH) list(APPEND SCUDO_CFLAGS "--sysroot=${COMPILER_RT_SCUDO_STANDALONE_SYSROOT_PATH}")