[llvm] [llvm-objdump][ELF]Fix crash when reading strings from .dynstr (PR #125679)
Ruoyu Qiu via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 28 02:59:04 PST 2025
https://github.com/cabbaken updated https://github.com/llvm/llvm-project/pull/125679
>From 2cc575140bce6a42b48d265287827cdf64afd284 Mon Sep 17 00:00:00 2001
From: cabbaken <cabbaken at outlook.com>
Date: Sun, 26 Jan 2025 17:37:46 +0800
Subject: [PATCH 1/9] [llvm-objdump][ELF]Fix crash when reading strings from
.dynstr(#86612)
This change introduces a check for the strtab offset
to prevent llvm-objdump from crashing when processing
malformed ELF files.
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
Signed-off-by: cabbaken <cabbaken at outlook.com>
---
.../llvm-objdump/ELF/dynamic-section.test | 34 +++++++++++++++++++
llvm/tools/llvm-objdump/ELFDump.cpp | 23 +++++++++++++
2 files changed, 57 insertions(+)
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 5205c5a3876d5..33ca7e5b40c26 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 e9e5b059f1786..9aa54fc58d67f 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;
>From e8414fc23ffdc1cecbc702302b7a35f2a1892b81 Mon Sep 17 00:00:00 2001
From: cabbaken <cabbaken at outlook.com>
Date: Thu, 6 Feb 2025 16:46:24 +0800
Subject: [PATCH 2/9] [llvm-objdump][ELF] Fix test file format
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
.../llvm-objdump/ELF/dynamic-section.test | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 33ca7e5b40c26..39c1a241a8667 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
@@ -438,9 +438,6 @@ 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
@@ -474,6 +471,19 @@ Sections:
- Tag: DT_NULL
Value: 0x0
+# RUN: yaml2obj --docnum=5 %s -o %t5
+# RUN: llvm-objdump -p %t5 2>&1 | FileCheck %s --strict-whitespace -DFILE=%t5 --check-prefix=WARN
+
+# WARN: Program Header:
+# WARN: LOAD off 0x00000000000000b0 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0
+# WARN: filesz 0x0000000000000040 memsz 0x0000000000000040 flags ---
+# WARN: DYNAMIC off 0x00000000000000c0 vaddr 0x000000000000101d paddr 0x000000000000101d align 2**0
+# WARN: filesz 0x0000000000000030 memsz 0x0000000000000030 flags ---
+# WARN: Dynamic Section:
+# WARN: : warning: '[[FILE]]': invalid string table offset
+# WARN: NEEDED 0x0000001245657656
+# WARN: STRTAB 0x0000000000001000
+
--- !ELF
FileHeader:
Class: ELFCLASS64
@@ -503,4 +513,4 @@ ProgramHeaders:
- Type: PT_DYNAMIC
VAddr: 0x101D
FirstSec: .dynamic
- LastSec: .dynamic
\ No newline at end of file
+ LastSec: .dynamic
>From 1acfb611b68a0d73be45902dbc9917170ab7174b Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Mon, 10 Feb 2025 20:16:13 +0800
Subject: [PATCH 3/9] Update
llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
Co-authored-by: James Henderson <James.Henderson at sony.com>
---
llvm/test/tools/llvm-objdump/ELF/dynamic-section.test | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 39c1a241a8667..72642f64ceb9d 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
@@ -480,7 +480,7 @@ Sections:
# WARN: DYNAMIC off 0x00000000000000c0 vaddr 0x000000000000101d paddr 0x000000000000101d align 2**0
# WARN: filesz 0x0000000000000030 memsz 0x0000000000000030 flags ---
# WARN: Dynamic Section:
-# WARN: : warning: '[[FILE]]': invalid string table offset
+# WARN: warning: '[[FILE]]': invalid string table offset
# WARN: NEEDED 0x0000001245657656
# WARN: STRTAB 0x0000000000001000
>From 21560c7dc0f24c4fd82cc0b9bbbc4cec4f392d5c Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Wed, 12 Feb 2025 09:10:16 +0000
Subject: [PATCH 4/9] Fix .dynstr string size check and modify code style.
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
llvm/tools/llvm-objdump/ELFDump.cpp | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index 9aa54fc58d67f..efb848d16b1bd 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -14,11 +14,8 @@
#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"
@@ -224,11 +221,19 @@ 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;
+ typename ELFT::Xword StringTableSize{0};
+ for (const typename ELFT::Shdr &Sec : cantFail(Elf.sections())) {
+ if (Sec.sh_type == ELF::SHT_DYNSYM) {
+ Expected<const typename ELFT::Shdr *> StringTableSecOrError =
+ getSection<ELFT>(cantFail(Elf.sections()), Sec.sh_link);
+ if (!StringTableSecOrError) {
+ consumeError(StringTableSecOrError.takeError());
+ break;
+ }
+ StringTableSize = StringTableSize < (*StringTableSecOrError)->sh_size
+ ? (*StringTableSecOrError)->sh_size
+ : StringTableSize;
+ }
}
for (const typename ELFT::Dyn &Dyn : DynamicEntries) {
if (Dyn.d_tag == ELF::DT_STRSZ) {
>From f1e32bcca355c4d300c64231995ec4d31103452d Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Wed, 12 Feb 2025 16:00:51 +0000
Subject: [PATCH 5/9] Optimize warning report format.
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
.../tools/llvm-objdump/ELF/dynamic-section.test | 15 +++++++++------
llvm/tools/llvm-objdump/ELFDump.cpp | 11 +++++++----
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 72642f64ceb9d..3a016fd108444 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
@@ -475,14 +475,15 @@ Sections:
# RUN: llvm-objdump -p %t5 2>&1 | FileCheck %s --strict-whitespace -DFILE=%t5 --check-prefix=WARN
# WARN: Program Header:
-# WARN: LOAD off 0x00000000000000b0 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0
-# WARN: filesz 0x0000000000000040 memsz 0x0000000000000040 flags ---
-# WARN: DYNAMIC off 0x00000000000000c0 vaddr 0x000000000000101d paddr 0x000000000000101d align 2**0
-# WARN: filesz 0x0000000000000030 memsz 0x0000000000000030 flags ---
+# WARN: LOAD off 0x00000000000000b0 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0
+# WARN: filesz 0x0000000000000050 memsz 0x0000000000000050 flags ---
+# WARN: DYNAMIC off 0x00000000000000c0 vaddr 0x000000000000101d paddr 0x000000000000101d align 2**0
+# WARN: filesz 0x0000000000000040 memsz 0x0000000000000040 flags ---
# WARN: Dynamic Section:
# WARN: warning: '[[FILE]]': invalid string table offset
-# WARN: NEEDED 0x0000001245657656
+# WARN: NEEDED 0x0000000000000011
# WARN: STRTAB 0x0000000000001000
+# WARN: STRSZ 0x0000000000000010
--- !ELF
FileHeader:
@@ -500,9 +501,11 @@ Sections:
Type: SHT_DYNAMIC
Entries:
- Tag: DT_NEEDED
- Value: 0x1245657656
+ Value: 0x11
- Tag: DT_STRTAB
Value: 0x1000
+ - Tag: DT_STRSZ
+ Value: 0x10
- Tag: DT_NULL
Value: 0x0
ProgramHeaders:
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index efb848d16b1bd..d4aec0f02e402 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -223,12 +223,13 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
outs() << "\nDynamic Section:\n";
typename ELFT::Xword StringTableSize{0};
for (const typename ELFT::Shdr &Sec : cantFail(Elf.sections())) {
- if (Sec.sh_type == ELF::SHT_DYNSYM) {
+ if (Sec.sh_type == ELF::SHT_DYNAMIC || Sec.sh_type == ELF::SHT_DYNSYM) {
Expected<const typename ELFT::Shdr *> StringTableSecOrError =
getSection<ELFT>(cantFail(Elf.sections()), Sec.sh_link);
if (!StringTableSecOrError) {
- consumeError(StringTableSecOrError.takeError());
- break;
+ reportWarning(toString(StringTableSecOrError.takeError()),
+ Obj.getFileName());
+ continue;
}
StringTableSize = StringTableSize < (*StringTableSecOrError)->sh_size
? (*StringTableSecOrError)->sh_size
@@ -258,7 +259,9 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
if (StrTabOrErr) {
const char *Data = StrTabOrErr->data();
if (Dyn.getVal() >= StringTableSize) {
- reportWarning("invalid string table offset", Obj.getFileName());
+ reportWarning("invalid string table offset, string table size: 0x" +
+ Twine::utohexstr(StringTableSize),
+ Obj.getFileName());
outs() << format(TagFmt.c_str(), Str.c_str())
<< format(Fmt, (uint64_t)Dyn.getVal());
continue;
>From 4181db5ca0264169e9b1cb30e66972ec1289449b Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Thu, 20 Feb 2025 05:26:13 +0000
Subject: [PATCH 6/9] Add getDynamicStrTab String size check
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
llvm/tools/llvm-objdump/ELFDump.cpp | 36 +++++++++--------------------
1 file changed, 11 insertions(+), 25 deletions(-)
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index d4aec0f02e402..7f1b0d559f817 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -63,14 +63,22 @@ static Expected<StringRef> getDynamicStrTab(const ELFFile<ELFT> &Elf) {
if (!DynamicEntriesOrError)
return DynamicEntriesOrError.takeError();
+ typename ELFT::Xword StringTableSize{0};
+ const uint8_t *MappedAddr{nullptr};
for (const typename ELFT::Dyn &Dyn : *DynamicEntriesOrError) {
if (Dyn.d_tag == ELF::DT_STRTAB) {
auto MappedAddrOrError = Elf.toMappedAddr(Dyn.getPtr());
if (!MappedAddrOrError)
return MappedAddrOrError.takeError();
- return StringRef(reinterpret_cast<const char *>(*MappedAddrOrError));
+ MappedAddr = *MappedAddrOrError;
+ }
+ if (Dyn.d_tag == ELF::DT_STRSZ) {
+ StringTableSize = Dyn.getVal();
}
}
+ if (MappedAddr && StringTableSize)
+ return StringRef(reinterpret_cast<const char *>(MappedAddr),
+ StringTableSize);
// If the dynamic segment is not present, we fall back on the sections.
auto SectionsOrError = Elf.sections();
@@ -221,28 +229,6 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
std::string TagFmt = " %-" + std::to_string(MaxLen) + "s ";
outs() << "\nDynamic Section:\n";
- typename ELFT::Xword StringTableSize{0};
- for (const typename ELFT::Shdr &Sec : cantFail(Elf.sections())) {
- if (Sec.sh_type == ELF::SHT_DYNAMIC || Sec.sh_type == ELF::SHT_DYNSYM) {
- Expected<const typename ELFT::Shdr *> StringTableSecOrError =
- getSection<ELFT>(cantFail(Elf.sections()), Sec.sh_link);
- if (!StringTableSecOrError) {
- reportWarning(toString(StringTableSecOrError.takeError()),
- Obj.getFileName());
- continue;
- }
- StringTableSize = StringTableSize < (*StringTableSecOrError)->sh_size
- ? (*StringTableSecOrError)->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)
@@ -258,9 +244,9 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
Expected<StringRef> StrTabOrErr = getDynamicStrTab(Elf);
if (StrTabOrErr) {
const char *Data = StrTabOrErr->data();
- if (Dyn.getVal() >= StringTableSize) {
+ if (Dyn.getVal() >= StrTabOrErr->size()) {
reportWarning("invalid string table offset, string table size: 0x" +
- Twine::utohexstr(StringTableSize),
+ Twine::utohexstr(StrTabOrErr->size()),
Obj.getFileName());
outs() << format(TagFmt.c_str(), Str.c_str())
<< format(Fmt, (uint64_t)Dyn.getVal());
>From a8107b34c9b66578ed3e999396b0eee1f6fdd4b7 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Mon, 24 Feb 2025 01:56:59 +0000
Subject: [PATCH 7/9] modify pointer initialize format.
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
llvm/tools/llvm-objdump/ELFDump.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index 7f1b0d559f817..adf2f901719e0 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -64,7 +64,7 @@ static Expected<StringRef> getDynamicStrTab(const ELFFile<ELFT> &Elf) {
return DynamicEntriesOrError.takeError();
typename ELFT::Xword StringTableSize{0};
- const uint8_t *MappedAddr{nullptr};
+ const uint8_t *MappedAddr = nullptr;
for (const typename ELFT::Dyn &Dyn : *DynamicEntriesOrError) {
if (Dyn.d_tag == ELF::DT_STRTAB) {
auto MappedAddrOrError = Elf.toMappedAddr(Dyn.getPtr());
>From 6eeb6ee2a782501eddf9aec5c5e6f66549a08ef5 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Tue, 25 Feb 2025 12:48:45 +0000
Subject: [PATCH 8/9] Optimize dynamic-section.test and code style.
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
.../tools/llvm-objdump/ELF/dynamic-section.test | 14 +++++---------
llvm/tools/llvm-objdump/ELFDump.cpp | 6 +++---
2 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 3a016fd108444..3c9805c7ff2a6 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
@@ -474,14 +474,10 @@ Sections:
# RUN: yaml2obj --docnum=5 %s -o %t5
# RUN: llvm-objdump -p %t5 2>&1 | FileCheck %s --strict-whitespace -DFILE=%t5 --check-prefix=WARN
-# WARN: Program Header:
-# WARN: LOAD off 0x00000000000000b0 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0
-# WARN: filesz 0x0000000000000050 memsz 0x0000000000000050 flags ---
-# WARN: DYNAMIC off 0x00000000000000c0 vaddr 0x000000000000101d paddr 0x000000000000101d align 2**0
-# WARN: filesz 0x0000000000000040 memsz 0x0000000000000040 flags ---
# WARN: Dynamic Section:
# WARN: warning: '[[FILE]]': invalid string table offset
-# WARN: NEEDED 0x0000000000000011
+# WARN: NEEDED 0x0000000000000010
+# WARN: NEEDED
# WARN: STRTAB 0x0000000000001000
# WARN: STRSZ 0x0000000000000010
@@ -496,12 +492,13 @@ Sections:
Type: SHT_STRTAB
Address: 0x1000
Size: 0x10
- Content: "004400550066007700"
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_NEEDED
- Value: 0x11
+ Value: 0x10
+ - Tag: DT_NEEDED
+ Value: 0x0F
- Tag: DT_STRTAB
Value: 0x1000
- Tag: DT_STRSZ
@@ -514,6 +511,5 @@ ProgramHeaders:
FirstSec: .dynstr
LastSec: .dynamic
- Type: PT_DYNAMIC
- VAddr: 0x101D
FirstSec: .dynamic
LastSec: .dynamic
diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index adf2f901719e0..c959b61e17074 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -72,15 +72,15 @@ static Expected<StringRef> getDynamicStrTab(const ELFFile<ELFT> &Elf) {
return MappedAddrOrError.takeError();
MappedAddr = *MappedAddrOrError;
}
- if (Dyn.d_tag == ELF::DT_STRSZ) {
+ if (Dyn.d_tag == ELF::DT_STRSZ)
StringTableSize = Dyn.getVal();
- }
}
if (MappedAddr && StringTableSize)
return StringRef(reinterpret_cast<const char *>(MappedAddr),
StringTableSize);
- // If the dynamic segment is not present, we fall back on the sections.
+ // If the dynamic segment is not present, or is missing the important tags, we
+ // fall back on the sections.
auto SectionsOrError = Elf.sections();
if (!SectionsOrError)
return SectionsOrError.takeError();
>From 7e569fbb3cb8896860ab6cd295998bf84b7cc2e1 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Fri, 28 Feb 2025 10:57:29 +0000
Subject: [PATCH 9/9] Fix check of dynamic-section.test
Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
llvm/test/tools/llvm-objdump/ELF/dynamic-section.test | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
index 3c9805c7ff2a6..b84a6e56881d4 100644
--- a/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-section.test
@@ -475,11 +475,11 @@ Sections:
# RUN: llvm-objdump -p %t5 2>&1 | FileCheck %s --strict-whitespace -DFILE=%t5 --check-prefix=WARN
# WARN: Dynamic Section:
-# WARN: warning: '[[FILE]]': invalid string table offset
-# WARN: NEEDED 0x0000000000000010
-# WARN: NEEDED
-# WARN: STRTAB 0x0000000000001000
-# WARN: STRSZ 0x0000000000000010
+# WARN-NEXT: warning: '[[FILE]]': invalid string table offset
+# WARN-NEXT: NEEDED 0x0000000000000010
+# WARN-NEXT: NEEDED {{$}}
+# WARN-NEXT: STRTAB 0x0000000000001000
+# WARN-NEXT: STRSZ 0x0000000000000010
--- !ELF
FileHeader:
More information about the llvm-commits
mailing list