[PATCH] D53993: [ELF] Change sh_link of .rel{, a}.plt to make GNU strip happy

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 1 15:31:18 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL345899: [ELF] Change sh_link of .rel{,a}.plt to make GNU strip happy (authored by MaskRay, committed by ).

Repository:
  rL LLVM

https://reviews.llvm.org/D53993

Files:
  lld/trunk/ELF/SyntheticSections.cpp
  lld/trunk/test/ELF/aarch64-gnu-ifunc.s
  lld/trunk/test/ELF/gnu-ifunc-i386.s
  lld/trunk/test/ELF/gnu-ifunc.s


Index: lld/trunk/test/ELF/gnu-ifunc-i386.s
===================================================================
--- lld/trunk/test/ELF/gnu-ifunc-i386.s
+++ lld/trunk/test/ELF/gnu-ifunc-i386.s
@@ -15,7 +15,7 @@
 // CHECK-NEXT:  Address: [[RELA:.*]]
 // CHECK-NEXT:  Offset: 0xD4
 // CHECK-NEXT:  Size: 16
-// CHECK-NEXT:  Link: 6
+// CHECK-NEXT:  Link: 0
 // CHECK-NEXT:  Info: 4
 // CHECK-NEXT:  AddressAlignment: 4
 // CHECK-NEXT:  EntrySize: 8
Index: lld/trunk/test/ELF/aarch64-gnu-ifunc.s
===================================================================
--- lld/trunk/test/ELF/aarch64-gnu-ifunc.s
+++ lld/trunk/test/ELF/aarch64-gnu-ifunc.s
@@ -15,7 +15,7 @@
 // CHECK-NEXT:  Address: [[RELA:.*]]
 // CHECK-NEXT:  Offset: 0x158
 // CHECK-NEXT:  Size: 48
-// CHECK-NEXT:  Link: 6
+// CHECK-NEXT:  Link: 0
 // CHECK-NEXT:  Info: 4
 // CHECK-NEXT:  AddressAlignment: 8
 // CHECK-NEXT:  EntrySize: 24
Index: lld/trunk/test/ELF/gnu-ifunc.s
===================================================================
--- lld/trunk/test/ELF/gnu-ifunc.s
+++ lld/trunk/test/ELF/gnu-ifunc.s
@@ -15,16 +15,13 @@
 // CHECK-NEXT:  Address: [[RELA:.*]]
 // CHECK-NEXT:  Offset: 0x158
 // CHECK-NEXT:  Size: 48
-// CHECK-NEXT:  Link: [[SYMTAB:.*]]
+// CHECK-NEXT:  Link: 0
 // CHECK-NEXT:  Info: [[GOTPLT:.*]]
 // CHECK-NEXT:  AddressAlignment: 8
 // CHECK-NEXT:  EntrySize: 24
 // CHECK-NEXT: }
 // CHECK:      Index: [[GOTPLT]]
 // CHECK-NEXT: Name: .got.plt
-// CHECK:      Index: [[SYMTAB]]
-// CHECK-NEXT: Name: .symtab
-// CHECK-NEXT: Type: SHT_SYMTAB
 // CHECK:      Relocations [
 // CHECK-NEXT:   Section ({{.*}}) .rela.plt {
 // CHECK-NEXT:     0x202000 R_X86_64_IRELATIVE
Index: lld/trunk/ELF/SyntheticSections.cpp
===================================================================
--- lld/trunk/ELF/SyntheticSections.cpp
+++ lld/trunk/ELF/SyntheticSections.cpp
@@ -1491,15 +1491,11 @@
 }
 
 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, .rel{,a}.plt contains R_*_IRELATIVE
+  // relocations due to IFUNC (e.g. strcpy). sh_link will be set to 0 in that
+  // case.
+  InputSection *SymTab = Config->Relocatable ? In.SymTab : In.DynSymTab;
+  getParent()->Link = SymTab ? SymTab->getParent()->SectionIndex : 0;
 
   if (In.RelaIplt == this || In.RelaPlt == this)
     getParent()->Info = In.GotPlt->getParent()->SectionIndex;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53993.172252.patch
Type: text/x-patch
Size: 2795 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181101/d1a4daff/attachment.bin>


More information about the llvm-commits mailing list