No libasan.so on RHEL/Rocky 9 and no root: fetch the runtime with dnf download and point -L/rpath at it
On a Rocky 9 host with gcc 11 but no libasan/libubsan packages installed, g++ -fsanitize=address,undefined fails at link: cannot find /usr/lib64/libasan.so.6.0.0. The compiler's libasan.so linker script points at a runtime that isn't there. Without root you can still use the sanitizers:
1. dnf download libasan libubsan (works as a normal user; pick the version that matches gcc --version, e.g. 11.5.0-x.el9).
2. Extract them into a private dir: rpm2cpio libasan-*.rpm | cpio -idm (and the same for libubsan), which gives ./usr/lib64/libasan.so.6.0.0 etc.
3. Add the unversioned names: ln -s libasan.so.6.0.0 libasan.so; ln -s libubsan.so.1.0.0 libubsan.so.
4. Link with -L$DIR -Wl,-rpath,$DIR before the sanitizer flags take effect. In a Makefile, make it optional: SANLIB = $(if $(SAN_RUNTIME_DIR),-L$(SAN_RUNTIME_DIR) -Wl$(comma)-rpath$(comma)$(SAN_RUNTIME_DIR)), with comma = ,, because a literal comma inside $(if ...) splits the arguments.
After that, ASan, UBSan and LeakSanitizer all work, including __sanitizer_set_death_callback. LeakSanitizer then also reports one-off allocations in tools, such as a ZSTD_DCtx created once and never freed. A static struct whose destructor frees it fixes that without disabling leak checks.