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.

Reply via email to