No. A shared object is needed if it is linked in (1)--no-as-needed mode or (2) after --gc-sections, a symbol referenced by a live input section is defined by the shared object. You'll need to check whether a symbol is defined by libmvec.so.1 On Mon, Nov 9, 2020 at 9:57 AM Alexandre Bique <bique.alexandre at gmail.com> wrote:> > On Mon, Nov 9, 2020 at 6:52 PM Fāng-ruì Sòng <maskray at google.com> wrote: > > Recent libm.a and libm.so are actually linker scripts > > > > % cat /usr/lib/x86_64-linux-gnu/libm.a > > /* GNU ld script > > */ > > OUTPUT_FORMAT(elf64-x86-64) > > GROUP ( /usr/lib/x86_64-linux-gnu/libm-2.31.a > > /usr/lib/x86_64-linux-gnu/libmvec.a ) > > % cat /usr/lib/x86_64-linux-gnu/libm.so > > /* GNU ld script > > */ > > OUTPUT_FORMAT(elf64-x86-64) > > GROUP ( /lib/x86_64-linux-gnu/libm.so.6 AS_NEEDED ( > > /lib/x86_64-linux-gnu/libmvec.so.1 ) ) > > In this script the libmvec is mentioned as "AS_NEEDED", and it is not > needed in my case, yet lld pulls its dependency toward exp at GLIBC_2.29. > > Is it a bug in lld? > > Regards, > Alexandre-- 宋方睿
On Mon, Nov 9, 2020 at 10:04 AM Fāng-ruì Sòng <maskray at google.com> wrote:> > No. A shared object is needed if it is linked in (1)--no-as-needed > mode or (2) after --gc-sections, a symbol referenced by a live input > section is defined by the shared object.A shared object is needed if it is linked in (1) --no-as-needed mode or (2) after --gc-sections, a symbol referenced by a live input section is defined by the shared object as non-STB_WEAK.> You'll need to check whether a symbol is defined by libmvec.so.1 > > On Mon, Nov 9, 2020 at 9:57 AM Alexandre Bique > <bique.alexandre at gmail.com> wrote: > > > > On Mon, Nov 9, 2020 at 6:52 PM Fāng-ruì Sòng <maskray at google.com> wrote: > > > Recent libm.a and libm.so are actually linker scripts > > > > > > % cat /usr/lib/x86_64-linux-gnu/libm.a > > > /* GNU ld script > > > */ > > > OUTPUT_FORMAT(elf64-x86-64) > > > GROUP ( /usr/lib/x86_64-linux-gnu/libm-2.31.a > > > /usr/lib/x86_64-linux-gnu/libmvec.a ) > > > % cat /usr/lib/x86_64-linux-gnu/libm.so > > > /* GNU ld script > > > */ > > > OUTPUT_FORMAT(elf64-x86-64) > > > GROUP ( /lib/x86_64-linux-gnu/libm.so.6 AS_NEEDED ( > > > /lib/x86_64-linux-gnu/libmvec.so.1 ) ) > > > > In this script the libmvec is mentioned as "AS_NEEDED", and it is not > > needed in my case, yet lld pulls its dependency toward exp at GLIBC_2.29. > > > > Is it a bug in lld? > > > > Regards, > > Alexandre > > > > -- > 宋方睿-- 宋方睿
Thank you very much for your help Fāng-ruì Sòng. I've tried various things like linking directly to libm-2.32 but it didn't work, it seems that libm-2.32 still pulls libmvec. I have the following linker flags: CLANG_LDFLAGS="-fuse-ld=lld -static-libstdc++ -static-libgcc -fvisibility=hidden -fdata-sections -ffunction-sections" CLANG_LDFLAGS="$CLANG_LDFLAGS -Wl,--gc-sections -Wl,-O1 -Wl,--as-needed -Wl,--strip-all" CLANG_LDFLAGS="$CLANG_LDFLAGS -Wl,-y,exp,-y,exp at GLIBC_2.29,-y,exp at GLIBC_2.2.5" How to find what is pulling libmvec? On the other hand, I don't understand why I have to specify that I want exp from glibc 2.2 or 2.29, I just want the exp symbol, and if possible the latest version available on the system. Because I don't have a high precision requirement so they would all be fine. Is that possible? Regards, Alexandre Bique On Mon, Nov 9, 2020 at 7:06 PM Fāng-ruì Sòng <maskray at google.com> wrote:> > On Mon, Nov 9, 2020 at 10:04 AM Fāng-ruì Sòng <maskray at google.com> wrote: > > > > No. A shared object is needed if it is linked in (1)--no-as-needed > > mode or (2) after --gc-sections, a symbol referenced by a live input > > section is defined by the shared object. > > A shared object is needed if it is linked in (1) --no-as-needed mode > or (2) after --gc-sections, a symbol referenced by a live input > section is defined by the shared object as non-STB_WEAK. > > > You'll need to check whether a symbol is defined by libmvec.so.1 > > > > On Mon, Nov 9, 2020 at 9:57 AM Alexandre Bique > > <bique.alexandre at gmail.com> wrote: > > > > > > On Mon, Nov 9, 2020 at 6:52 PM Fāng-ruì Sòng <maskray at google.com> wrote: > > > > Recent libm.a and libm.so are actually linker scripts > > > > > > > > % cat /usr/lib/x86_64-linux-gnu/libm.a > > > > /* GNU ld script > > > > */ > > > > OUTPUT_FORMAT(elf64-x86-64) > > > > GROUP ( /usr/lib/x86_64-linux-gnu/libm-2.31.a > > > > /usr/lib/x86_64-linux-gnu/libmvec.a ) > > > > % cat /usr/lib/x86_64-linux-gnu/libm.so > > > > /* GNU ld script > > > > */ > > > > OUTPUT_FORMAT(elf64-x86-64) > > > > GROUP ( /lib/x86_64-linux-gnu/libm.so.6 AS_NEEDED ( > > > > /lib/x86_64-linux-gnu/libmvec.so.1 ) ) > > > > > > In this script the libmvec is mentioned as "AS_NEEDED", and it is not > > > needed in my case, yet lld pulls its dependency toward exp at GLIBC_2.29. > > > > > > Is it a bug in lld? > > > > > > Regards, > > > Alexandre > > > > > > > > -- > > 宋方睿 > > > > -- > 宋方睿