summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2018-08-04 22:30:15 +0200
committerMark Wielaard <mark@klomp.org>2018-09-14 00:43:42 +0200
commit7859092379225482ffd4b49de2d18ad2d69ce810 (patch)
tree89f7a2004e622bee4ee91c01956fe017dafea8f1
parentd5b050281e43754ac444e39d3e392831f4488c59 (diff)
readelf: Use elf_getshdrnum in print_shdr and print_phdr.
print_shdr didn't print the correct number of sections if there were more than SHN_LORESERVE sections. print_phdr wouldn't match up the (allocated) sections and segements if there were more than SHN_LORESERVE sections in the ELF file. Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r--src/ChangeLog5
-rw-r--r--src/readelf.c25
2 files changed, 25 insertions, 5 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 524c81ac..6a702ee1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,10 @@
2018-09-13 Mark Wielaard <mark@klomp.org>
+ * readelf.c (print_shdr): Get number of section with elf_getshdrnum.
+ (print_phdr): Likewise.
+
+2018-09-13 Mark Wielaard <mark@klomp.org>
+
* strip.c (handle_elf): Check against shstrndx, not e_shstrndx.
Explicitly set shdrstrndx for debug file.
* unstrip.c (copy_elf): Explicitly copy shstrndx.
diff --git a/src/readelf.c b/src/readelf.c
index 7b488ac5..bddcd703 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -1184,15 +1184,24 @@ print_shdr (Ebl *ebl, GElf_Ehdr *ehdr)
size_t shstrndx;
if (! print_file_header)
- printf (gettext ("\
-There are %d section headers, starting at offset %#" PRIx64 ":\n\
+ {
+ size_t sections;
+ if (unlikely (elf_getshdrnum (ebl->elf, &sections) < 0))
+ error (EXIT_FAILURE, 0,
+ gettext ("cannot get number of sections: %s"),
+ elf_errmsg (-1));
+
+ printf (gettext ("\
+There are %zd section headers, starting at offset %#" PRIx64 ":\n\
\n"),
- ehdr->e_shnum, ehdr->e_shoff);
+ sections, ehdr->e_shoff);
+ }
/* Get the section header string table index. */
if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
- gettext ("cannot get section header string table index"));
+ gettext ("cannot get section header string table index: %s"),
+ elf_errmsg (-1));
puts (gettext ("Section Headers:"));
@@ -1384,7 +1393,13 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
}
}
- if (ehdr->e_shnum == 0)
+ size_t sections;
+ if (unlikely (elf_getshdrnum (ebl->elf, &sections) < 0))
+ error (EXIT_FAILURE, 0,
+ gettext ("cannot get number of sections: %s"),
+ elf_errmsg (-1));
+
+ if (sections == 0)
/* No sections in the file. Punt. */
return;