Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -1491,15 +1491,15 @@ } void RelocationBaseSection::finalizeContents() { - // If all relocations are R_*_{,I}RELATIVE they don't refer to any dynamic - // symbol and we don't need a dynamic symbol table. If that is the case, use - // the index of the regular symbol table section (if exists) or 0. - if (In.DynSymTab) - getParent()->Link = In.DynSymTab->getParent()->SectionIndex; - else if (In.SymTab) - getParent()->Link = In.SymTab->getParent()->SectionIndex; - else - getParent()->Link = 0; + // When linking glibc statically, .rela?.plt contains R_*_IRELATIVE + // relocations due to IFUNC (e.g. strcpy). Just set sh_link to 0 as there is + // no .dynsym. We cannot set it to .symtab as otherwise GNU strip will change + // the address of .rela.plt (and rename it to .rela.got.plt) and break + // __rela_iplt_{start,end} used in glibc/csu/libc-start.c:apply_irel. Note, + // GNU readelf will warn "Link field (0) should index a symtab section", but + // we can live with that. + getParent()->Link = + In.DynSymTab ? In.DynSymTab->getParent()->SectionIndex : 0; if (In.RelaIplt == this || In.RelaPlt == this) getParent()->Info = In.GotPlt->getParent()->SectionIndex;