https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98669
--- Comment #9 from Matthias Klose <doko at debian dot org> --- The Debian GCC has a patch to make --as-needed the default. It looks like gcc-10 then links to an a.out which is not linked against libcrypt. This seems to work with gcc-9, but not with -10 and -11. $ gcc-9 -fsanitize=address crypt.c -lcrypt && ldd a.out|egrep 'asan|crypt' libasan.so.5 => /usr/lib/x86_64-linux-gnu/libasan.so.5 (0x00007fc9606a7000) libcrypt.so.1 => /usr/lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fc96066c000) $ gcc-10 -fsanitize=address crypt.c -lcrypt && ldd a.out|egrep 'asan|crypt' libasan.so.6 => /usr/lib/x86_64-linux-gnu/libasan.so.6 (0x00007f90c79bf000) /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper -plugin-opt=-fresolution=/tmp/ccwabMO2.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/10 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. /usr/lib/gcc/x86_64-linux-gnu/10/libasan_preinit.o --push-state --no-as-needed -lasan --pop-state /tmp/ccsFKez1.o -lcrypt -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o so the link line looks like --as-needed ... /usr/lib/gcc/x86_64-linux-gnu/10/libasan_preinit.o --push-state --no-as-needed -lasan --pop-state /tmp/ccsFKez1.o -lcrypt ... Explicitly linking with -lcrypt works: $ gcc-10 -fsanitize=address crypt.c -Wl,--push-state,--no-as-needed -lcrypt -Wl,--pop-state && ldd a.out|egrep 'asan|crypt' libasan.so.6 => /usr/lib/x86_64-linux-gnu/libasan.so.6 (0x00007ffb6ad5e000) libcrypt.so.1 => /usr/lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007ffb6ad23000) But I fail to see why this worked with GCC 9.