[PATCH] D85623: [llvm-objdump] Change a PLT decoding error to a warning

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 9 23:15:23 PDT 2020


MaskRay created this revision.
MaskRay added reviewers: grimar, jhenderson.
Herald added subscribers: llvm-commits, rupprecht, kristof.beyls, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.
MaskRay requested review of this revision.

If the referenced symbol of a J[U]MP_SLOT is invalid (e.g. symbol index 0), llvm-objdump -d will bail out:

  error: 'a': st_name (0x326600) is past the end of the string table of size 0x7

Change it to a warning to continue dumping. Noticed when trying an LLD patch.
`X86/plt.test` uses a prebuilt executable, so I pick `ELF/AArch64/plt.test`
which has a YAML input and can be easily modified.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85623

Files:
  llvm/test/tools/llvm-objdump/ELF/AArch64/plt.test
  llvm/tools/llvm-objdump/llvm-objdump.cpp


Index: llvm/tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1396,11 +1396,17 @@
     for (auto PltEntry : ElfObj->getPltAddresses()) {
       SymbolRef Symbol(PltEntry.first, ElfObj);
       uint8_t SymbolType = getElfSymbolType(Obj, Symbol);
-
-      StringRef Name = unwrapOrError(Symbol.getName(), Obj->getFileName());
-      if (!Name.empty())
-        AllSymbols[*Plt].emplace_back(
-            PltEntry.second, Saver.save((Name + "@plt").str()), SymbolType);
+      if (Expected<StringRef> NameOrErr = Symbol.getName()) {
+        if (!NameOrErr->empty())
+          AllSymbols[*Plt].emplace_back(PltEntry.second,
+                                        Saver.save((*NameOrErr + "@plt").str()),
+                                        SymbolType);
+      } else {
+        consumeError(NameOrErr.takeError());
+        reportWarning("PLT entry at 0x" + Twine::utohexstr(PltEntry.second) +
+                          " references an invalid symbol",
+                      Obj->getFileName());
+      }
     }
   }
 }
Index: llvm/test/tools/llvm-objdump/ELF/AArch64/plt.test
===================================================================
--- llvm/test/tools/llvm-objdump/ELF/AArch64/plt.test
+++ llvm/test/tools/llvm-objdump/ELF/AArch64/plt.test
@@ -5,7 +5,7 @@
 # CHECK-NEXT: adrp      x16, {{.*}}
 # CHECK: bl {{.*}} <__cfi_slowpath at plt>
 
-# RUN: yaml2obj %s -o %t.aarch64
+# RUN: yaml2obj -D SYM=f1 %s -o %t.aarch64
 # RUN: llvm-objdump -d --mattr=+bti %t.aarch64 | \
 # RUN:   FileCheck --check-prefix=CHECK-BTI %s
 # CHECK-BTI: bl {{.*}} <f1 at plt>
@@ -18,6 +18,12 @@
 # CHECK-BTI-NEXT: bti   c
 # CHECK-BTI-NEXT: adrp  x16, {{.*}}
 
+# RUN: yaml2obj %s -o %t.warn
+# RUN: llvm-objdump -d %t.warn 2>&1 | FileCheck %s --check-prefix=INVALID -DFILE=%t.warn
+
+# INVALID: warning: '[[FILE]]': PLT entry at 0x210030 references an invalid symbol
+# INVALID: Disassembly of section .text:
+
 --- !ELF
 FileHeader:
   Class:   ELFCLASS64
@@ -32,7 +38,7 @@
     Info:    .got.plt
     Relocations:
       - Offset: 0x0000000000230018
-        Symbol: f1
+        Symbol: [[SYM=<none>]]
         Type:   R_AARCH64_JUMP_SLOT
       - Offset: 0x0000000000230020
         Symbol: f2


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85623.284256.patch
Type: text/x-patch
Size: 2338 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200810/c8ebad61/attachment.bin>


More information about the llvm-commits mailing list