[llvm] 3961438 - [llvm-readelf] - Do not crash when relocation references a STT_SECTION symbol for the null section.

Georgii Rymar via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 16 05:01:54 PDT 2020


Author: Georgii Rymar
Date: 2020-06-16T15:01:24+03:00
New Revision: 3961438c7844b116dad621d652995dd1244a17d3

URL: https://github.com/llvm/llvm-project/commit/3961438c7844b116dad621d652995dd1244a17d3
DIFF: https://github.com/llvm/llvm-project/commit/3961438c7844b116dad621d652995dd1244a17d3.diff

LOG: [llvm-readelf] - Do not crash when relocation references a STT_SECTION symbol for the null section.

Currently, llvm-readelf crashes when there is a STT_SECTION symbol for the null section
and this symbol is used in a relocation.

Differential revision: https://reviews.llvm.org/D81840

Added: 
    

Modified: 
    llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test
    llvm/tools/llvm-readobj/ELFDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test b/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test
index 2a401f86c506..704c2e0c4afe 100644
--- a/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test
@@ -5,23 +5,26 @@
 # RUN: yaml2obj %s -o %t
 # RUN: llvm-readelf --relocations --dyn-relocations %t | FileCheck %s
 
-# CHECK:      Relocation section '.rela.text' at offset {{.*}} contains 3 entries:
+# CHECK:      Relocation section '.rela.text' at offset {{.*}} contains 4 entries:
 # CHECK-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
 # CHECK-NEXT: 0000000000000000  0000000000000000 R_X86_64_NONE                           1
 # CHECK-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE          0000000000000000 sym + 1
 # CHECK-NEXT: 0000000000000000  0000000200000000 R_X86_64_NONE          0000000000000123 456
+# CHECK-NEXT: 0000000000000000  0000000300000000 R_X86_64_NONE                           678
 
-# CHECK:      Relocation section '.rela.dyn' at offset {{.*}} contains 3 entries:
+# CHECK:      Relocation section '.rela.dyn' at offset {{.*}} contains 4 entries:
 # CHECK-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
 # CHECK-NEXT: 0000000000000000  0000000000000000 R_X86_64_NONE                           1
 # CHECK-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE          0000000000000000 sym + 1
 # CHECK-NEXT: 0000000000000000  0000000200000000 R_X86_64_NONE          0000000000000123 456
+# CHECK-NEXT: 0000000000000000  0000000300000000 R_X86_64_NONE                           678
 
-# CHECK:      'RELA' relocation section at offset {{.*}} contains 72 bytes:
+# CHECK:      'RELA' relocation section at offset {{.*}} contains 96 bytes:
 # CHECK-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
 # CHECK-NEXT: 0000000000000000  0000000000000000 R_X86_64_NONE                           1
 # CHECK-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE          0000000000000000 sym + 1
 # CHECK-NEXT: 0000000000000000  0000000200000000 R_X86_64_NONE          0000000000000123 456
+# CHECK-NEXT: 0000000000000000  0000000300000000 R_X86_64_NONE                           678
 
 --- !ELF
 FileHeader:
@@ -49,6 +52,10 @@ Sections:
         Type: R_X86_64_NONE
         Addend: 0x456
         Symbol: 2
+      - Offset: 0
+        Addend: 0x678
+        Type:   R_X86_64_NONE
+        Symbol: 3
   - Name: .dynamic
     Type: SHT_DYNAMIC
     Flags: [SHF_ALLOC]
@@ -58,7 +65,7 @@ Sections:
       - Tag: DT_RELA
         Value: 0x1100
       - Tag: DT_RELASZ
-        Value: 72
+        Value: 96
       - Tag: DT_RELAENT
         Value: 24
       - Tag: DT_NULL
@@ -81,6 +88,10 @@ Sections:
         Type: R_X86_64_NONE
         Addend: 0x456
         Symbol: 2
+      - Offset: 0
+        Addend: 0x678
+        Type:   R_X86_64_NONE
+        Symbol: 3
 Symbols:
   - Name:    sym
     Value:   0
@@ -89,6 +100,8 @@ Symbols:
   - Value:   0x123
     Section: .text
     Binding: STB_GLOBAL
+  - Type:  STT_SECTION
+    Index: 0
 DynamicSymbols:
   - Name:    sym
     Value:   0
@@ -97,6 +110,8 @@ DynamicSymbols:
   - Value:   0x123
     Section: .text
     Binding: STB_GLOBAL
+  - Type:  STT_SECTION
+    Index: 0
 ProgramHeaders:
   - Type: PT_LOAD
     VAddr: 0x1000

diff  --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 8ed13ab1a2b5..8f65b1a71029 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1082,6 +1082,9 @@ ELFDumper<ELFT>::getRelocationTarget(const Elf_Shdr *SymTab,
         Obj->getSection(Sym, SymTab, ShndxTable);
     if (!SecOrErr)
       return SecOrErr.takeError();
+    // A section symbol describes the section at index 0.
+    if (*SecOrErr == nullptr)
+      return std::make_pair(Sym, "");
 
     Expected<StringRef> NameOrErr = Obj->getSectionName(*SecOrErr);
     if (!NameOrErr)


        


More information about the llvm-commits mailing list