[lld] r345648 - [ELF] Fallback to sh_link=0 if neither .dynsym nor .symtab exists

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 30 13:54:55 PDT 2018


Author: maskray
Date: Tue Oct 30 13:54:54 2018
New Revision: 345648

URL: http://llvm.org/viewvc/llvm-project?rev=345648&view=rev
Log:
[ELF] Fallback to sh_link=0 if neither .dynsym nor .symtab exists

Summary: .rela.plt may only contain R_*_{,I}RELATIVE relocations and not need a symbol table link. bfd/gold fallbacks to sh_link=0 in this case. Without this patch, ld.lld --strip-all caused lld to dereference a null pointer.

Reviewers: ruiu, grimar, espindola

Reviewed By: ruiu

Subscribers: emaste, arichardson, llvm-commits

Differential Revision: https://reviews.llvm.org/D53881

Modified:
    lld/trunk/ELF/SyntheticSections.cpp
    lld/trunk/test/ELF/gnu-ifunc-relative.s

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=345648&r1=345647&r2=345648&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Tue Oct 30 13:54:54 2018
@@ -1491,11 +1491,15 @@ void RelocationBaseSection::addReloc(con
 }
 
 void RelocationBaseSection::finalizeContents() {
-  // If all relocations are R_*_RELATIVE they don't refer to any
-  // dynamic symbol and we don't need a dynamic symbol table. If that
-  // is the case, just use the index of the regular symbol table section.
-  getParent()->Link = In.DynSymTab ? In.DynSymTab->getParent()->SectionIndex
-                                   : In.SymTab->getParent()->SectionIndex;
+  // 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;
 
   if (In.RelaIplt == this || In.RelaPlt == this)
     getParent()->Info = In.GotPlt->getParent()->SectionIndex;

Modified: lld/trunk/test/ELF/gnu-ifunc-relative.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gnu-ifunc-relative.s?rev=345648&r1=345647&r2=345648&view=diff
==============================================================================
--- lld/trunk/test/ELF/gnu-ifunc-relative.s (original)
+++ lld/trunk/test/ELF/gnu-ifunc-relative.s Tue Oct 30 13:54:54 2018
@@ -1,7 +1,9 @@
 // REQUIRES: x86
 // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-// RUN: ld.lld -static %t.o -o %tout
-// RUN: llvm-readobj -r -t %tout | FileCheck %s
+// RUN: ld.lld --strip-all %t.o -o %t
+// RUN: llvm-readobj -r %t | FileCheck %s
+// RUN: ld.lld %t.o -o %t
+// RUN: llvm-readobj -r -t %t | FileCheck %s --check-prefixes=CHECK,SYM
 
 .type foo STT_GNU_IFUNC
 .globl foo
@@ -16,8 +18,8 @@ _start:
 // CHECK-NEXT:   R_X86_64_IRELATIVE - 0x[[ADDR:.*]]
 // CHECK-NEXT: }
 
-// CHECK:      Name: foo
-// CHECK-NEXT: Value: 0x[[ADDR]]
-// CHECK-NEXT: Size: 0
-// CHECK-NEXT: Binding: Global
-// CHECK-NEXT: Type: GNU_IFunc
+// SYM:      Name: foo
+// SYM-NEXT: Value: 0x[[ADDR]]
+// SYM-NEXT: Size: 0
+// SYM-NEXT: Binding: Global
+// SYM-NEXT: Type: GNU_IFunc




More information about the llvm-commits mailing list