mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 17:40:49 +00:00
include/elf/
PR 5900 * common.h (SHN_BAD): Delete. (SHN_LORESERVE .. SHN_HIRESERVE): Move to.. * external.h: ..here. * internal.h (SHN_LORESERVE, SHN_HIRESERVE): Define. (SHN_LOPROC, SHN_HIPROC, SHN_LOOS, SHN_HIOS): Define. (SHN_ABS, SHN_COMMON, SHN_XINDEX, SHN_BAD): Define. bfd/ PR 5900 * elf-bfd.h: Include elf/internal.h after elf/external.h. * elfcode.h (elf_swap_symbol_in): Map reserved shndx range. (elf_swap_symbol_out): Adjust SHN_XINDEX test. (elf_swap_ehdr_out): Mask SHN_LORESERVE and SHN_XINDEX to values seen in external structs. (valid_section_index_p): Delete. (elf_object_p): Don't increment section numbers over reserved range. Simplify test for valid sh_link, sh_info and e_shstrndx fields. (elf_write_shdrs_and_ehdr): Mask SHN_LORESERVE and SHN_XINDEX to values seen in external structs. Don't increment section numbers over reserved range. * elf.c (bfd_elf_sym_name): Remove redundant tests on st_shndx. (bfd_section_from_shdr): Likewise. (group_signature): Range check before accessing elf_elfsections. (_bfd_elf_setup_sections): Likewise. (bfd_section_from_shdr): Likewise. (bfd_section_from_shdr): Don't increment section number over reserved sections. (assign_file_positions_for_non_load_sections): Likewise. (assign_file_positions_except_relocs): Likewise. (_bfd_elf_write_object_contents): Likewise. (assign_section_numbers): Likewise. Adjust for changed SHN_*. (prep_headers): Delete unused variable. * elflink.c (bfd_elf_link_record_local_dynamic_symbol): Adjust for changed SHN_* values. (check_dynsym, elf_link_input_bfd): Likewise. (bfd_elf_final_link): Likewise. Don't skip over reserved section range. (elf_fixup_link_order): Check that sh_link field is valid. * elf-hppa.h (elf_hppa_add_symbol_hook): Make "index" unsigned. * elf32-arm.c (elf32_arm_gc_mark_extra_sections): Range check before accesssing elf_elfsections. * elf32-avr.c (elf32_avr_size_stubs): Likewise. * elf32-hppa.c (elf32_hppa_size_stubs): Likewise. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs): Likewise. * elf64-hppa.c (elf64_hppa_check_relocs): Adjust for changed SHN_* defines. Test for SHN_BAD return from _bfd_elf_section_from_bfd_section binutils/ PR 5900 * readelf.c (SECTION_HEADER_INDEX, SECTION_HEADER_NUM): Delete. Remove use throughout file. (SECTION_HEADER): Likewise. (dump_relocations): Don't adjust st_shndx for reserved range. (process_file_header): Mask SHN_XINDEX to values seen in external elf structs. Simplify valid section index tests. (get_32bit_elf_symbols, get_64bit_elf_symbols): Mask SHN_XINDEX. Map reserved st_shndx to internal form. (process_section_groups): Test that group symbol st_shndx is in range, not just non-zero. Delete reserved range check. (get_symbol_index_type): Mask "type" to 16 bits when printing PRC, OS or RSV. gdb/ PR 5900 * elfread.c (elf_symtab_read): Make shndx an unsigned int. * mipsread.c: Include elf/internal.h. (read_alphacoff_dynamic_symtab): Map external reserved sym_shndx to internal range. ld/testsuite/ PR 5900 * ld-elf/sec64k.exp: Update.
This commit is contained in:
@@ -189,12 +189,14 @@ elf_swap_symbol_in (bfd *abfd,
|
||||
dst->st_info = H_GET_8 (abfd, src->st_info);
|
||||
dst->st_other = H_GET_8 (abfd, src->st_other);
|
||||
dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
|
||||
if (dst->st_shndx == SHN_XINDEX)
|
||||
if (dst->st_shndx == (SHN_XINDEX & 0xffff))
|
||||
{
|
||||
if (shndx == NULL)
|
||||
return FALSE;
|
||||
dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
|
||||
}
|
||||
else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
|
||||
dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -215,12 +217,12 @@ elf_swap_symbol_out (bfd *abfd,
|
||||
H_PUT_8 (abfd, src->st_info, dst->st_info);
|
||||
H_PUT_8 (abfd, src->st_other, dst->st_other);
|
||||
tmp = src->st_shndx;
|
||||
if (tmp > SHN_HIRESERVE)
|
||||
if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
|
||||
{
|
||||
if (shndx == NULL)
|
||||
abort ();
|
||||
H_PUT_32 (abfd, tmp, shndx);
|
||||
tmp = SHN_XINDEX;
|
||||
tmp = SHN_XINDEX & 0xffff;
|
||||
}
|
||||
H_PUT_16 (abfd, tmp, dst->st_shndx);
|
||||
}
|
||||
@@ -280,12 +282,12 @@ elf_swap_ehdr_out (bfd *abfd,
|
||||
H_PUT_16 (abfd, src->e_phnum, dst->e_phnum);
|
||||
H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
|
||||
tmp = src->e_shnum;
|
||||
if (tmp >= SHN_LORESERVE)
|
||||
if (tmp >= (SHN_LORESERVE & 0xffff))
|
||||
tmp = SHN_UNDEF;
|
||||
H_PUT_16 (abfd, tmp, dst->e_shnum);
|
||||
tmp = src->e_shstrndx;
|
||||
if (tmp >= SHN_LORESERVE)
|
||||
tmp = SHN_XINDEX;
|
||||
if (tmp >= (SHN_LORESERVE & 0xffff))
|
||||
tmp = SHN_XINDEX & 0xffff;
|
||||
H_PUT_16 (abfd, tmp, dst->e_shstrndx);
|
||||
}
|
||||
|
||||
@@ -470,25 +472,6 @@ elf_file_p (Elf_External_Ehdr *x_ehdrp)
|
||||
&& (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
|
||||
}
|
||||
|
||||
/* Determines if a given section index is valid. */
|
||||
|
||||
static inline bfd_boolean
|
||||
valid_section_index_p (unsigned index, unsigned num_sections)
|
||||
{
|
||||
/* Note: We allow SHN_UNDEF as a valid section index. */
|
||||
if (index < SHN_LORESERVE || index > SHN_HIRESERVE)
|
||||
return index < num_sections;
|
||||
|
||||
/* We disallow the use of reserved indcies, except for those
|
||||
with OS or Application specific meaning. The test make use
|
||||
of the knowledge that:
|
||||
SHN_LORESERVE == SHN_LOPROC
|
||||
and
|
||||
SHN_HIPROC == SHN_LOOS - 1 */
|
||||
/* XXX - Should we allow SHN_XINDEX as a valid index here ? */
|
||||
return (index >= SHN_LOPROC && index <= SHN_HIOS);
|
||||
}
|
||||
|
||||
/* Check to see if the file associated with ABFD matches the target vector
|
||||
that ABFD points to.
|
||||
|
||||
@@ -707,7 +690,7 @@ elf_object_p (bfd *abfd)
|
||||
}
|
||||
|
||||
/* And similarly for the string table index. */
|
||||
if (i_ehdrp->e_shstrndx == SHN_XINDEX)
|
||||
if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
|
||||
{
|
||||
i_ehdrp->e_shstrndx = i_shdr.sh_link;
|
||||
if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
|
||||
@@ -753,8 +736,6 @@ elf_object_p (bfd *abfd)
|
||||
if (!i_shdrp)
|
||||
goto got_no_match;
|
||||
num_sec = i_ehdrp->e_shnum;
|
||||
if (num_sec > SHN_LORESERVE)
|
||||
num_sec += SHN_HIRESERVE + 1 - SHN_LORESERVE;
|
||||
elf_numsections (abfd) = num_sec;
|
||||
amt = sizeof (i_shdrp) * num_sec;
|
||||
elf_elfsections (abfd) = bfd_alloc (abfd, amt);
|
||||
@@ -762,16 +743,7 @@ elf_object_p (bfd *abfd)
|
||||
goto got_no_match;
|
||||
|
||||
memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
|
||||
shdrp = i_shdrp;
|
||||
shindex = 0;
|
||||
if (num_sec > SHN_LORESERVE)
|
||||
{
|
||||
for ( ; shindex < SHN_LORESERVE; shindex++)
|
||||
elf_elfsections (abfd)[shindex] = shdrp++;
|
||||
for ( ; shindex < SHN_HIRESERVE + 1; shindex++)
|
||||
elf_elfsections (abfd)[shindex] = i_shdrp;
|
||||
}
|
||||
for ( ; shindex < num_sec; shindex++)
|
||||
for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
|
||||
elf_elfsections (abfd)[shindex] = shdrp++;
|
||||
|
||||
/* Read in the rest of the section header table and convert it
|
||||
@@ -783,13 +755,13 @@ elf_object_p (bfd *abfd)
|
||||
elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
|
||||
|
||||
/* Sanity check sh_link and sh_info. */
|
||||
if (! valid_section_index_p (i_shdrp[shindex].sh_link, num_sec))
|
||||
if (i_shdrp[shindex].sh_link >= num_sec)
|
||||
goto got_wrong_format_error;
|
||||
|
||||
if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
|
||||
|| i_shdrp[shindex].sh_type == SHT_RELA
|
||||
|| i_shdrp[shindex].sh_type == SHT_REL)
|
||||
&& ! valid_section_index_p (i_shdrp[shindex].sh_info, num_sec))
|
||||
&& i_shdrp[shindex].sh_info >= num_sec)
|
||||
goto got_wrong_format_error;
|
||||
|
||||
/* If the section is loaded, but not page aligned, clear
|
||||
@@ -807,7 +779,7 @@ elf_object_p (bfd *abfd)
|
||||
/* A further sanity check. */
|
||||
if (i_ehdrp->e_shnum != 0)
|
||||
{
|
||||
if (! valid_section_index_p (i_ehdrp->e_shstrndx, elf_numsections (abfd)))
|
||||
if (i_ehdrp->e_shstrndx >= elf_numsections (abfd))
|
||||
{
|
||||
/* PR 2257:
|
||||
We used to just goto got_wrong_format_error here
|
||||
@@ -856,12 +828,8 @@ elf_object_p (bfd *abfd)
|
||||
a dummy placeholder entry, so we ignore it. */
|
||||
num_sec = elf_numsections (abfd);
|
||||
for (shindex = 1; shindex < num_sec; shindex++)
|
||||
{
|
||||
if (! bfd_section_from_shdr (abfd, shindex))
|
||||
goto got_no_match;
|
||||
if (shindex == SHN_LORESERVE - 1)
|
||||
shindex += SHN_HIRESERVE + 1 - SHN_LORESERVE;
|
||||
}
|
||||
if (!bfd_section_from_shdr (abfd, shindex))
|
||||
goto got_no_match;
|
||||
|
||||
/* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER. */
|
||||
if (! _bfd_elf_setup_sections (abfd))
|
||||
@@ -1081,9 +1049,9 @@ elf_write_shdrs_and_ehdr (bfd *abfd)
|
||||
|
||||
/* Some fields in the first section header handle overflow of ehdr
|
||||
fields. */
|
||||
if (i_ehdrp->e_shnum >= SHN_LORESERVE)
|
||||
if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
|
||||
i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
|
||||
if (i_ehdrp->e_shstrndx >= SHN_LORESERVE)
|
||||
if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
|
||||
i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
|
||||
|
||||
/* at this point we've concocted all the ELF sections... */
|
||||
@@ -1099,9 +1067,6 @@ elf_write_shdrs_and_ehdr (bfd *abfd)
|
||||
elf_debug_section (count, *i_shdrp);
|
||||
#endif
|
||||
elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
|
||||
|
||||
if (count == SHN_LORESERVE - 1)
|
||||
i_shdrp += SHN_HIRESERVE + 1 - SHN_LORESERVE;
|
||||
}
|
||||
if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
|
||||
|| bfd_bwrite (x_shdrp, amt, abfd) != amt)
|
||||
|
||||
Reference in New Issue
Block a user