summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/ELFDumper.cpp
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-05-24 11:12:50 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-05-24 11:12:50 +0000
commitf835fcf412c92eac20bf2110e13c49fc86d0c55c (patch)
tree8d7807c5fee4950b50ec16d22b233cb51d0b4716 /llvm/tools/llvm-readobj/ELFDumper.cpp
parentb7f2a2b4c0ec40e17371c5b15d4e92b39b196c5c (diff)
downloadbcm5719-llvm-f835fcf412c92eac20bf2110e13c49fc86d0c55c.tar.gz
bcm5719-llvm-f835fcf412c92eac20bf2110e13c49fc86d0c55c.zip
[llvm-readelf] - Allow dumping of the .dynamic section even if there is no PT_DYNAMIC header.
It is now possible after D61937 was landed and was discussed in it's review comments. It is not consistent with GNU, which does not output .dynamic section content in this case for no visible reason. Differential revision: https://reviews.llvm.org/D62179 llvm-svn: 361630
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp18
1 files changed, 9 insertions, 9 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 159e300de30..b86a6c192ca 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1331,6 +1331,7 @@ static const char *getElfMipsOptionsOdkType(unsigned Odk) {
template <typename ELFT>
void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
+ // Try to locate the PT_DYNAMIC header.
const Elf_Phdr *DynamicPhdr = nullptr;
for (const Elf_Phdr &Phdr : unwrapOrError(Obj->program_headers())) {
if (Phdr.p_type != ELF::PT_DYNAMIC)
@@ -1339,11 +1340,6 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
break;
}
- // We do not want to dump dynamic section if we have no PT_DYNAMIC header.
- // This matches GNU's behavior.
- if (!DynamicPhdr)
- return;
-
// Try to locate the .dynamic section in the sections header table.
const Elf_Shdr *DynamicSec = nullptr;
for (const Elf_Shdr &Sec : unwrapOrError(Obj->sections())) {
@@ -1358,9 +1354,16 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
// Ignore sh_entsize and use the expected value for entry size explicitly.
// This allows us to dump the dynamic sections with a broken sh_entsize
// field.
- if (DynamicSec)
+ if (DynamicSec) {
DynamicTable = checkDRI({ObjF->getELFFile()->base() + DynamicSec->sh_offset,
DynamicSec->sh_size, sizeof(Elf_Dyn)});
+ parseDynamicTable();
+ }
+
+ // If we have a PT_DYNAMIC header, we will either check the found dynamic
+ // section or take the dynamic table data directly from the header.
+ if (!DynamicPhdr)
+ return;
if (DynamicPhdr->p_offset + DynamicPhdr->p_filesz >
ObjF->getMemoryBufferRef().getBufferSize())
@@ -1374,7 +1377,6 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
}
StringRef Name = unwrapOrError(Obj->getSectionName(DynamicSec));
-
if (DynamicSec->sh_addr + DynamicSec->sh_size >
DynamicPhdr->p_vaddr + DynamicPhdr->p_memsz ||
DynamicSec->sh_addr < DynamicPhdr->p_vaddr)
@@ -1386,8 +1388,6 @@ void ELFDumper<ELFT>::loadDynamicTable(const ELFFile<ELFT> *Obj) {
reportWarning("The SHT_DYNAMIC section '" + Name +
"' is not at the start of "
"PT_DYNAMIC segment");
-
- parseDynamicTable();
}
template <typename ELFT>
OpenPOWER on IntegriCloud