[llvm] 3b0a4e9 - [llvm-readobj] - Refine logic of the symbol table locating in printRelocationsHelper().
Georgii Rymar via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 12 04:04:13 PDT 2020
Author: Georgii Rymar
Date: 2020-08-12T14:03:56+03:00
New Revision: 3b0a4e9584535b7799825c0cefc89d2571da5901
URL: https://github.com/llvm/llvm-project/commit/3b0a4e9584535b7799825c0cefc89d2571da5901
DIFF: https://github.com/llvm/llvm-project/commit/3b0a4e9584535b7799825c0cefc89d2571da5901.diff
LOG: [llvm-readobj] - Refine logic of the symbol table locating in printRelocationsHelper().
This removes the last `unwrapOrError` call from the `printRelocationsHelper`.
There is a little additional complexity because of `SHT_RELR/SHT_ANDROID_RELR` sections.
Such sections contains only relative relocations and they do not have a
symbol table associated with them, hence we should not try to treat
their `sh_link` field as a reference to a symbol table.
Differential revision: https://reviews.llvm.org/D85430
Added:
Modified:
llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
llvm/test/tools/llvm-readobj/ELF/relocations.test
llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
llvm/tools/llvm-readobj/ELFDumper.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
index 305fef7a6278..bdadeddbbeac 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
@@ -36,7 +36,7 @@ Sections:
- Name: .rela.dyn
Type: SHT_ANDROID_RELA
Flags: [ SHF_ALLOC ]
- Link: .symtab
+ Link: [[LINK=.symtab]]
Content: 41505332088020020108800280010202088180808010818080802002080181808080100802818080802004020C7E048180808010088180808020
ShOffset: [[SHOFFSET=<none>]]
Symbols:
@@ -60,6 +60,24 @@ Symbols:
## FIXME: GNU still reports an error before trying to dump relocations.
# BROKEN-RELA-GNU: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x3a) that is greater than the file size (0x238)
+## Check we report a warning when the sh_link field of the SHT_ANDROID_RELA section is broken.
+
+# RUN: yaml2obj --docnum=1 -DLINK=0xffffffff %s -o %t1.broken.link
+# RUN: llvm-readobj --relocations %t1.broken.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t1.broken.link --check-prefix=BROKEN-RELA-LINK-LLVM %s
+# RUN: llvm-readelf --relocations %t1.broken.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t1.broken.link --check-prefix=BROKEN-RELA-LINK-GNU %s
+
+# BROKEN-RELA-LINK-LLVM: Relocations [
+# BROKEN-RELA-LINK-LLVM-NEXT: Section (1) .rela.dyn {
+# BROKEN-RELA-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_ANDROID_RELA section with index 1: invalid section index: 4294967295
+# BROKEN-RELA-LINK-LLVM-NEXT: }
+# BROKEN-RELA-LINK-LLVM-NEXT: ]
+
+# BROKEN-RELA-LINK-GNU: Relocation section '.rela.dyn' at offset 0x40 contains 8 entries:
+# BROKEN-RELA-LINK-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# BROKEN-RELA-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_ANDROID_RELA section with index 1: invalid section index: 4294967295
+
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-readobj --relocations %t2 | FileCheck --check-prefix=LLVM2 %s
# LLVM2: Section (1) .rel.dyn {
@@ -99,7 +117,7 @@ Sections:
- Name: .rel.dyn
Type: SHT_ANDROID_REL
Flags: [ SHF_ALLOC ]
- Link: .symtab
+ Link: [[LINK=.symtab]]
Content: 415053320A80200202088102830408037C08
ShOffset: [[SHOFFSET=<none>]]
Symbols:
@@ -123,6 +141,24 @@ Symbols:
## FIXME: GNU still reports an error before trying to dump relocations.
# BROKEN-REL-GNU: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
+## Check we report a warning when the sh_link field of the SHT_ANDROID_REL section is broken.
+
+# RUN: yaml2obj --docnum=2 -DLINK=0xffffffff %s -o %t2.broken.link
+# RUN: llvm-readobj --relocations %t2.broken.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.broken.link --check-prefix=BROKEN-REL-LINK-LLVM %s
+# RUN: llvm-readelf --relocations %t2.broken.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.broken.link --check-prefix=BROKEN-REL-LINK-GNU %s
+
+# BROKEN-REL-LINK-LLVM: Relocations [
+# BROKEN-REL-LINK-LLVM-NEXT: Section (1) .rel.dyn {
+# BROKEN-REL-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_ANDROID_REL section with index 1: invalid section index: 4294967295
+# BROKEN-REL-LINK-LLVM-NEXT: }
+# BROKEN-REL-LINK-LLVM-NEXT: ]
+
+# BROKEN-REL-LINK-GNU: Relocation section '.rel.dyn' at offset 0x34 contains 10 entries:
+# BROKEN-REL-LINK-GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
+# BROKEN-REL-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_ANDROID_REL section with index 1: invalid section index: 4294967295
+
# RUN: yaml2obj --docnum=3 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM3 %s
#
# LLVM3: Section (1) .rela.dyn {
diff --git a/llvm/test/tools/llvm-readobj/ELF/relocations.test b/llvm/test/tools/llvm-readobj/ELF/relocations.test
index be8b62838639..1da0f2d0c4b9 100644
--- a/llvm/test/tools/llvm-readobj/ELF/relocations.test
+++ b/llvm/test/tools/llvm-readobj/ELF/relocations.test
@@ -128,6 +128,7 @@ Sections:
- Name: .rel.text
Type: SHT_REL
Info: .text
+ Link: [[LINK=.symtab]]
ShName: [[SHNAME=<none>]]
EntSize: [[ENTSIZEREL=<none>]]
Relocations:
@@ -145,6 +146,7 @@ Sections:
- Name: .rela.text
Type: SHT_RELA
Info: .text
+ Link: [[LINK=.symtab]]
ShName: [[SHNAME=<none>]]
EntSize: [[ENTSIZERELA=<none>]]
Relocations:
@@ -200,6 +202,7 @@ Symbols:
## Check we continue dumping other relocation sections if any.
## Case A: check the case when relocations can't be read from an SHT_REL section.
+## because of broken sh_entsize field.
# RUN: yaml2obj %s --docnum=1 -DENTSIZEREL=1 -o %t.broken.rel
# RUN: llvm-readobj --relocations %t.broken.rel 2>&1 \
# RUN: | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-LLVM
@@ -231,6 +234,7 @@ Symbols:
# BROKEN-REL-GNU-NEXT: 0000000000000009 000000090000000b R_X86_64_32S ffffffffffffffff rela_maxpos + 7fffffffffffffff
## Case B: check the case when relocations can't be read from an SHT_RELA section.
+## because of broken sh_entsize field.
# RUN: yaml2obj %s --docnum=1 -DENTSIZERELA=1 -o %t.broken.rela
# RUN: llvm-readobj --relocations %t.broken.rela 2>&1 \
# RUN: | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-LLVM
@@ -260,6 +264,31 @@ Symbols:
# BROKEN-RELA-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
# BROKEN-RELA-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has an invalid sh_entsize: 1
+## Case C: check the case when relocations can't be read from SHT_REL/SHT_RELA sections
+## because of broken sh_link fields.
+# RUN: yaml2obj %s --docnum=1 -DLINK=0xffff -o %t.broken.link
+# RUN: llvm-readobj --relocations %t.broken.link 2>&1 \
+# RUN: | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-LLVM
+# RUN: llvm-readelf --relocations %t.broken.link 2>&1 \
+# RUN: | FileCheck %s -DFILE=%t.broken.link --check-prefix=BROKEN-LINK-GNU
+
+# BROKEN-LINK-LLVM: Relocations [
+# BROKEN-LINK-LLVM-NEXT: Section (2) .rel.text {
+# BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535
+# BROKEN-LINK-LLVM-NEXT: }
+# BROKEN-LINK-LLVM-NEXT: Section (3) .rela.text {
+# BROKEN-LINK-LLVM-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535
+# BROKEN-LINK-LLVM-NEXT: }
+# BROKEN-LINK-LLVM-NEXT: ]
+
+# BROKEN-LINK-GNU: Relocation section '.rel.text' at offset 0x51 contains 4 entries:
+# BROKEN-LINK-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name
+# BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_REL section with index 2: invalid section index: 65535
+# BROKEN-LINK-GNU-EMPTY:
+# BROKEN-LINK-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 5 entries:
+# BROKEN-LINK-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# BROKEN-LINK-GNU-NEXT: warning: '[[FILE]]': unable to locate a symbol table for SHT_RELA section with index 3: invalid section index: 65535
+
## Show that ELF32 is dumped correctly.
# RUN: yaml2obj %s --docnum=2 -o %t32
# RUN: llvm-readobj -r %t32 \
diff --git a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
index 40916af5a0f4..16bb47ff03c2 100644
--- a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
+++ b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
@@ -151,6 +151,7 @@ Sections:
0x000F0501, 0x50400009 ]
EntSize: [[ENTSIZE=<none>]]
ShType: [[SHTYPE=<none>]]
+ Link: [[LINK=""]]
## Check we report a warning when we are unable to dump relocations
## for a SHT_RELR/SHT_ANDROID_RELR section.
@@ -179,3 +180,23 @@ Sections:
# RUN: not llvm-readelf --relocations %t2.broken.android 2>&1 | \
# RUN: FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-GNU %s
+
+## Check the behavior when the sh_link field of the SHT_RELR/SHT_ANDROID_RELR section
+## is set to an arbitrary value. Normally, it is set to 0, because such sections contains
+## only relative relocations and do not have an associated symbol table, like other
+## relocation sections.
+
+## Case A: check we do not report warnings when the sh_link field is set to an arbitrary value
+## and the --relocations option is requested.
+# RUN: yaml2obj --docnum=2 -DLINK=0xff %s -o %t2.has.link
+# RUN: llvm-readobj --relocations %t2.has.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.has.link --check-prefix=LLVM2 %s --implicit-check-not=warning:
+# RUN: llvm-readelf --relocations %t2.has.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.has.link --check-prefix=GNU2 %s --implicit-check-not=warning:
+
+## Case B: check we do not report warnings when the sh_link field is set to an arbitrary value
+## and --relocations and --raw-relr options are requested.
+# RUN: llvm-readobj --relocations --raw-relr %t2.has.link | \
+# RUN: FileCheck -DFILE=%t2.has.link --check-prefix=RAW-LLVM2 %s
+# RUN: llvm-readelf --relocations --raw-relr %t2.has.link 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.has.link --check-prefix=RAW-GNU2 %s
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index bce636f4641e..629774246b6a 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -5519,17 +5519,27 @@ void DumpStyle<ELFT>::printDependentLibsHelper(
template <class ELFT>
void DumpStyle<ELFT>::printRelocationsHelper(const ELFFile<ELFT> *Obj,
const Elf_Shdr &Sec) {
- const Elf_Shdr *SymTab =
- unwrapOrError(this->FileName, Obj->getSection(Sec.sh_link));
- unsigned SecNdx = &Sec - &cantFail(Obj->sections()).front();
- unsigned RelNdx = 0;
-
- auto Warn = [&](Error &&E) {
- this->reportUniqueWarning(createError("unable to read relocations from " +
- describe(Obj, Sec) + ": " +
- toString(std::move(E))));
+ auto Warn = [&](Error &&E,
+ const Twine &Prefix = "unable to read relocations from") {
+ this->reportUniqueWarning(createError(Prefix + " " + describe(Obj, Sec) +
+ ": " + toString(std::move(E))));
};
+ // SHT_RELR/SHT_ANDROID_RELR sections do not have an associated symbol table.
+ // For them we should not treat the value of the sh_link field as an index of
+ // a symbol table.
+ const Elf_Shdr *SymTab;
+ if (Sec.sh_type != ELF::SHT_RELR && Sec.sh_type != ELF::SHT_ANDROID_RELR) {
+ Expected<const Elf_Shdr *> SymTabOrErr = Obj->getSection(Sec.sh_link);
+ if (!SymTabOrErr) {
+ Warn(SymTabOrErr.takeError(), "unable to locate a symbol table for");
+ return;
+ }
+ SymTab = *SymTabOrErr;
+ }
+
+ unsigned SecNdx = &Sec - &cantFail(Obj->sections()).front();
+ unsigned RelNdx = 0;
switch (Sec.sh_type) {
case ELF::SHT_REL:
if (Expected<Elf_Rel_Range> RangeOrErr = Obj->rels(&Sec)) {
@@ -5561,7 +5571,7 @@ void DumpStyle<ELFT>::printRelocationsHelper(const ELFFile<ELFT> *Obj,
}
for (const Elf_Rel &R : Obj->decode_relrs(*RangeOrErr))
- printRelReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+ printRelReloc(Obj, SecNdx, /*SymTab=*/nullptr, R, ++RelNdx);
break;
}
case ELF::SHT_ANDROID_REL:
More information about the llvm-commits
mailing list