summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog7
-rw-r--r--src/elflint.c23
-rw-r--r--src/readelf.c13
3 files changed, 35 insertions, 8 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 97fd4495..9a0774d0 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,11 @@
2009-01-17 Ulrich Drepper <[email protected]>
+ * readelf.c (print_debug_exception_table): Show target of ar_disp
+ field.
+
+ * elflint.c (check_program_header): Add most consistency checks for
+ PT_GNU_EH_FRAME entry.
+
* addr2line.c: Use ARGP_PROGRAM_VERSION_HOOK_DEF and
ARGP_PROGRAM_BUG_ADDRESS_DEF.
* ar.c: Likewise.
@@ -11,6 +17,7 @@
* objdump.c: Likewise.
* ranlib.c: Likewise.
* readelf.c: Likewise.
+
* size.c: Likewise.
* strings.c: Likewise.
* strip.c: Likewise.
diff --git a/src/elflint.c b/src/elflint.c
index 19299023..f31b75c1 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -4199,10 +4199,11 @@ program header offset in ELF header and PHDR entry do not match"));
/* If there is an .eh_frame_hdr section it must be
referenced by this program header entry. */
Elf_Scn *scn = NULL;
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = NULL;
while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
{
- GElf_Shdr shdr_mem;
- GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ shdr = gelf_getshdr (scn, &shdr_mem);
if (shdr != NULL && shdr->sh_type == SHT_PROGBITS
&& ! strcmp (".eh_frame_hdr",
elf_strptr (ebl->elf, shstrndx, shdr->sh_name)))
@@ -4222,12 +4223,25 @@ call frame search table size mismatch in program and section header\n"));
if ((phdr->p_flags & PF_R) == 0)
ERROR (gettext ("\
call frame search table must be allocated\n"));
+ else if (shdr != NULL && (shdr->sh_flags & SHF_ALLOC) != 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' must be allocated\n"), elf_ndxscn (scn), ".eh_frame_hdr");
+
if ((phdr->p_flags & PF_W) != 0)
ERROR (gettext ("\
call frame search table must not be writable\n"));
+ else if (shdr != NULL && (shdr->sh_flags & SHF_WRITE) != 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' must not be writable\n"),
+ elf_ndxscn (scn), ".eh_frame_hdr");
+
if ((phdr->p_flags & PF_X) != 0)
ERROR (gettext ("\
call frame search table must not be executable\n"));
+ else if (shdr != NULL && (shdr->sh_flags & SHF_EXECINSTR) != 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' must not be executable\n"),
+ elf_ndxscn (scn), ".eh_frame_hdr");
/* Remember which entry this is. */
pt_gnu_eh_frame_pndx = cnt;
@@ -4253,10 +4267,9 @@ program header entry %d: file offset and virtual address not module of alignment
static void
-check_exception_data (Ebl *ebl, GElf_Ehdr *ehdr)
+check_exception_data (Ebl *ebl __attribute__ ((unused)),
+ GElf_Ehdr *ehdr __attribute__ ((unused)))
{
- ebl;
- ehdr;
}
diff --git a/src/readelf.c b/src/readelf.c
index a3223eb4..e0165366 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -6185,9 +6185,16 @@ print_debug_exception_table (Dwfl_Module *dwflmod __attribute__ ((unused)),
int ar_disp;
get_sleb128 (ar_disp, readp);
- printf (" [%4u] ar_filter: %d\n"
- " ar_disp: %d\n",
- u++, ar_filter, ar_disp);
+ printf (" [%4u] ar_filter: % d\n"
+ " ar_disp: % -5d",
+ u, ar_filter, ar_disp);
+ if (abs (ar_disp) & 1)
+ printf (" -> [%4u]\n", u + (ar_disp + 1) / 2);
+ else if (ar_disp != 0)
+ puts (" -> ???");
+ else
+ putchar_unlocked ('\n');
+ ++u;
}
while (readp < action_table_end);
}