From: Frantisek Sumsal Date: Sat, 6 Mar 2021 21:21:30 +0000 (+0100) Subject: test: tidy up the ASan-related stuff X-Git-Tag: v248-rc3~36^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=648fd18924847f71db1cc9fe407ba5b7938261b0;p=thirdparty%2Fsystemd.git test: tidy up the ASan-related stuff --- diff --git a/test/test-functions b/test/test-functions index 498fde567b5..5796c6d9387 100644 --- a/test/test-functions +++ b/test/test-functions @@ -198,13 +198,15 @@ if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then SKIP_INITRD="${SKIP_INITRD:-yes}" PATH_TO_INIT=$ROOTLIBDIR/systemd-under-asan QEMU_MEM="2048M" - QEMU_SMP=4 + QEMU_SMP="${QEMU_SMP:-4}" # We need to correctly distinguish between gcc's and clang's ASan DSOs. - if ldd $SYSTEMD | grep -q libasan.so; then + if ASAN_RT_NAME="$(ldd "$SYSTEMD" | awk '/libasan.so/ {x=$1; exit} END {print x; exit x==""}')"; then ASAN_COMPILER=gcc - elif ldd $SYSTEMD | grep -q libclang_rt.asan; then + ASAN_RT_PATH="$(readlink -f "$(${CC:-gcc} --print-file-name "$ASAN_RT_NAME")")" + elif ASAN_RT_NAME="$(ldd "$SYSTEMD" | awk '/libclang_rt.asan/ {x=$1; exit} END {print x; exit x==""}')"; then ASAN_COMPILER=clang + ASAN_RT_PATH="$(readlink -f "$(${CC:-clang} --print-file-name "$ASAN_RT_NAME")")" # As clang's ASan DSO is usually in a non-standard path, let's check if # the environment is set accordingly. If not, warn the user and exit. @@ -212,10 +214,8 @@ if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then # user should encounter (and fix) the same issue when running the unit # tests (meson test) if ldd "$SYSTEMD" | grep -q "libclang_rt.asan.*not found"; then - _asan_rt_name="$(ldd $SYSTEMD | awk '/libclang_rt.asan/ {print $1; exit}')" - _asan_rt_path="$(find /usr/lib* /usr/local/lib* -type f -name "$_asan_rt_name" 2>/dev/null | sed 1q)" - echo >&2 "clang's ASan DSO ($_asan_rt_name) is not present in the runtime library path" - echo >&2 "Consider setting LD_LIBRARY_PATH=${_asan_rt_path%/*}" + echo >&2 "clang's ASan DSO ($ASAN_RT_NAME) is not present in the runtime library path" + echo >&2 "Consider setting LD_LIBRARY_PATH=${ASAN_RT_PATH%/*}" exit 1 fi else @@ -223,6 +223,8 @@ if [[ "$IS_BUILT_WITH_ASAN" = "yes" ]]; then echo >&2 "gcc does this by default, for clang compile with -shared-libasan" exit 1 fi + + echo "Detected ASan RT '$ASAN_RT_NAME' located at '$ASAN_RT_PATH'" fi function find_qemu_bin() { @@ -654,26 +656,23 @@ create_asan_wrapper() { local _asan_rt_pattern ddebug "Create $_asan_wrapper" - case "$ASAN_COMPILER" in - gcc) - _asan_rt_pattern="*libasan*" - ;; - clang) - _asan_rt_pattern="libclang_rt.asan-*" - # Install llvm-symbolizer to generate useful reports - # See: https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports - dracut_install "llvm-symbolizer" - ;; - *) - dfail "Unsupported compiler: $ASAN_COMPILER" - exit 1 - esac + [[ -z "$ASAN_RT_PATH" ]] && dfatal "ASAN_RT_PATH is empty, but it shouldn't be" + + # clang: install llvm-symbolizer to generate useful reports + # See: https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports + [[ "$ASAN_COMPILER" == "clang" ]] && dracut_install "llvm-symbolizer" cat >$_asan_wrapper <&2 "Couldn't find ASan RT at '$ASAN_RT_PATH', can't continue" + exit 1 +fi + DEFAULT_ASAN_OPTIONS=${ASAN_OPTIONS:-strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1} DEFAULT_UBSAN_OPTIONS=${UBSAN_OPTIONS:-print_stacktrace=1:print_summary=1:halt_on_error=1} DEFAULT_ENVIRONMENT="ASAN_OPTIONS=\$DEFAULT_ASAN_OPTIONS UBSAN_OPTIONS=\$DEFAULT_UBSAN_OPTIONS" @@ -686,15 +685,15 @@ mount -t proc proc /proc mount -t sysfs sysfs /sys mount -o remount,rw / -PATH_TO_ASAN=\$(find / -name '$_asan_rt_pattern' | sed 1q) -if [[ "\$PATH_TO_ASAN" ]]; then - # A lot of services (most notably dbus) won't start without preloading libasan - # See https://github.com/systemd/systemd/issues/5004 - DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=\$PATH_TO_ASAN" +# A lot of services (most notably dbus) won't start without preloading libasan +# See https://github.com/systemd/systemd/issues/5004 +DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=$ASAN_RT_PATH" + +if [[ "$ASAN_COMPILER" == "clang" ]]; then # Let's add the ASan DSO's path to the dynamic linker's cache. This is pretty # unnecessary for gcc & libasan, however, for clang this is crucial, as its # runtime ASan DSO is in a non-standard (library) path. - echo \${PATH_TO_ASAN%/*} > /etc/ld.so.conf.d/asan-path-override.conf + echo "${ASAN_RT_PATH%/*}" > /etc/ld.so.conf.d/asan-path-override.conf ldconfig fi echo DefaultEnvironment=\$DEFAULT_ENVIRONMENT >>/etc/systemd/system.conf