[llvm] [llvm-objdump][ELF] Enhancing llvm-objdump stability and error handling(#86612) (PR #125679)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 4 05:01:08 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-binary-utilities
Author: Cabbaken (cabbaken)
<details>
<summary>Changes</summary>
This change introduces a check for the strtab offset to prevent llvm-objdump from crashing when processing malformed ELF files.
It provide a minimal reproduce test for https://github.com/llvm/llvm-project/issues/86612#issuecomment-2035694455.
Additionally, it modifies how llvm-objdump handles and outputs malformed ELF files with invalid string offsets.(More info: https://discourse.llvm.org/t/should-llvm-objdump-objdump-display-actual-corrupted-values-in-malformed-elf-files/84391)
---
Full diff: https://github.com/llvm/llvm-project/pull/125679.diff
2 Files Affected:
- (modified) llvm/test/tools/llvm-objdump/ELF/dynamic-section.test (+34)
- (modified) llvm/tools/llvm-objdump/ELFDump.cpp (+23)
``````````diff
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 5205c5a3876d5f..33ca7e5b40c262 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
@@ -438,6 +438,9 @@ ProgramHeaders:
# RUN: yaml2obj --docnum=4 %s -o %t4
# RUN: llvm-objdump -p %t4 | FileCheck %s --strict-whitespace --check-prefix=INDENT
+# RUN: yaml2obj --docnum=5 %s -o %t5
+# RUN: llvm-objdump -p %t5 | FileCheck %s --strict-whitespace --check-prefix=INDENT
+
# INDENT: {{^}}Dynamic Section:
# INDENT: {{^}} NEEDED 0x
@@ -470,3 +473,34 @@ Sections:
Value: 0x1
- Tag: DT_NULL
Value: 0x0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynstr
+ Type: SHT_STRTAB
+ Address: 0x1000
+ Size: 0x10
+ Content: "004400550066007700"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Entries:
+ - Tag: DT_NEEDED
+ Value: 0x1245657656
+ - Tag: DT_STRTAB
+ Value: 0x1000
+ - Tag: DT_NULL
+ Value: 0x0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ FirstSec: .dynstr
+ LastSec: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x101D
+ FirstSec: .dynamic
+ LastSec: .dynamic
\ No newline at end of file
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index e9e5b059f1786e..949bf1c6faacb8 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -14,8 +14,11 @@
#include "ELFDump.h"
#include "llvm-objdump.h"
+#include "llvm/BinaryFormat/ELF.h"
#include "llvm/Demangle/Demangle.h"
+#include "llvm/Object/ELF.h"
#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Object/ELFTypes.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
@@ -221,6 +224,20 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
std::string TagFmt = " %-" + std::to_string(MaxLen) + "s ";
outs() << "\nDynamic Section:\n";
+ auto StringTableSize = (typename ELFT::Xword)0;
+ for (const auto &Sec : cantFail(Elf.sections())) {
+ if (Sec.sh_type == ELF::SHT_STRTAB)
+ StringTableSize =
+ StringTableSize < Sec.sh_size ? Sec.sh_size : StringTableSize;
+ }
+ for (const typename ELFT::Dyn &Dyn : DynamicEntries) {
+ if (Dyn.d_tag == ELF::DT_STRSZ) {
+ StringTableSize =
+ StringTableSize < Dyn.getVal() ? Dyn.getVal() : StringTableSize;
+ break;
+ }
+ }
+
for (const typename ELFT::Dyn &Dyn : DynamicEntries) {
if (Dyn.d_tag == ELF::DT_NULL)
continue;
@@ -235,6 +252,12 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
Expected<StringRef> StrTabOrErr = getDynamicStrTab(Elf);
if (StrTabOrErr) {
const char *Data = StrTabOrErr->data();
+ if (Dyn.getVal() > StringTableSize) {
+ reportWarning("Invalid string table offset", Obj.getFileName());
+ outs() << format(TagFmt.c_str(), Str.c_str())
+ << format(Fmt, (uint64_t)Dyn.getVal());
+ continue;
+ }
outs() << format(TagFmt.c_str(), Str.c_str()) << Data + Dyn.getVal()
<< "\n";
continue;
``````````
</details>
https://github.com/llvm/llvm-project/pull/125679
More information about the llvm-commits
mailing list