* elf/external.h (GRP_ENTRY_SIZE): Define.

* readelf.c (CHECK_ENTSIZE_VALUES, CHECK_ENTSIZE): Define.
	(process_section_headers): Use it.
	(process_relocs): Don't crash if symsec is not SHT_SYMTAB
	or SHT_DYNSYM.
	(process_version_sections): Use sizeof (Elf_External_Versym)
	instead of sh_entsize.
This commit is contained in:
Jakub Jelinek 2005-06-17 13:37:26 +00:00
parent d6ab8113e3
commit 08d8fa1187
4 changed files with 47 additions and 2 deletions

View file

@ -1,3 +1,12 @@
2005-06-17 Jakub Jelinek <jakub@redhat.com>
* readelf.c (CHECK_ENTSIZE_VALUES, CHECK_ENTSIZE): Define.
(process_section_headers): Use it.
(process_relocs): Don't crash if symsec is not SHT_SYMTAB
or SHT_DYNSYM.
(process_version_sections): Use sizeof (Elf_External_Versym)
instead of sh_entsize.
2005-06-16 Nick Clifton <nickc@redhat.com>
* rename.c (simple_copy): Only define if it is going to be used.

View file

@ -3871,6 +3871,22 @@ process_section_headers (FILE *file)
break;
}
#define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
do \
{ \
size_t expected_entsize \
= is_32bit_elf ? size32 : size64; \
if (section->sh_entsize != expected_entsize) \
error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
i, (unsigned long int) section->sh_entsize, \
(unsigned long int) expected_entsize); \
section->sh_entsize = expected_entsize; \
} \
while (0)
#define CHECK_ENTSIZE(section, i, type) \
CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
sizeof (Elf64_External_##type))
for (i = 0, section = section_headers;
i < elf_header.e_shnum;
i++, section++)
@ -3885,6 +3901,7 @@ process_section_headers (FILE *file)
continue;
}
CHECK_ENTSIZE (section, i, Sym);
num_dynamic_syms = section->sh_size / section->sh_entsize;
dynamic_symbols = GET_ELF_SYMBOLS (file, section);
}
@ -3910,6 +3927,14 @@ process_section_headers (FILE *file)
}
symtab_shndx_hdr = section;
}
else if (section->sh_type == SHT_SYMTAB)
CHECK_ENTSIZE (section, i, Sym);
else if (section->sh_type == SHT_GROUP)
CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
else if (section->sh_type == SHT_REL)
CHECK_ENTSIZE (section, i, Rel);
else if (section->sh_type == SHT_RELA)
CHECK_ENTSIZE (section, i, Rela);
else if ((do_debugging || do_debug_info || do_debug_abbrevs
|| do_debug_lines || do_debug_pubnames || do_debug_aranges
|| do_debug_frames || do_debug_macinfo || do_debug_str
@ -4488,6 +4513,10 @@ process_relocs (FILE *file)
char *strtab = NULL;
symsec = SECTION_HEADER (section->sh_link);
if (symsec->sh_type != SHT_SYMTAB
&& symsec->sh_type != SHT_DYNSYM)
continue;
nsyms = symsec->sh_size / symsec->sh_entsize;
symtab = GET_ELF_SYMBOLS (file, symsec);
@ -6358,7 +6387,7 @@ process_version_sections (FILE *file)
break;
link_section = SECTION_HEADER (section->sh_link);
total = section->sh_size / section->sh_entsize;
total = section->sh_size / sizeof (Elf_External_Versym);
if (SECTION_HEADER_INDEX (link_section->sh_link)
>= elf_header.e_shnum)

View file

@ -1,3 +1,7 @@
2005-06-17 Jakub Jelinek <jakub@redhat.com>
* elf/external.h (GRP_ENTRY_SIZE): Define.
2005-06-08 Zack Weinberg <zack@codesourcery.com>
* dis-asm.h (get_arm_regnames): Update prototype.

View file

@ -1,5 +1,5 @@
/* ELF support for BFD.
Copyright 1991, 1992, 1993, 1995, 1997, 1998, 1999, 2001, 2003
Copyright 1991, 1992, 1993, 1995, 1997, 1998, 1999, 2001, 2003, 2005
Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
@ -272,5 +272,8 @@ typedef struct
unsigned char a_val[8];
} Elf64_External_Auxv;
/* Size of SHT_GROUP section entry. */
#define GRP_ENTRY_SIZE 4
#endif /* _ELF_EXTERNAL_H */