mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-05 21:50:21 +08:00
* elfcode.h (elf_swap_ehdr_out): Handle e_phnum > 0xffff.
(elf_object_p): Read e_phnum extension. (elf_write_shdrs_and_ehdr): Write e_phnum extension. * elfcore.h (elf_core_file_p): Read e_phnum extension. Sanity check that we can read last program header.
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
/* ELF executable support for BFD.
|
||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
Written by Fred Fish @ Cygnus Support, from information published
|
||||
@ -279,7 +279,10 @@ elf_swap_ehdr_out (bfd *abfd,
|
||||
H_PUT_32 (abfd, src->e_flags, dst->e_flags);
|
||||
H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
|
||||
H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
|
||||
H_PUT_16 (abfd, src->e_phnum, dst->e_phnum);
|
||||
tmp = src->e_phnum;
|
||||
if (tmp > PN_XNUM)
|
||||
tmp = PN_XNUM;
|
||||
H_PUT_16 (abfd, tmp, dst->e_phnum);
|
||||
H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
|
||||
tmp = src->e_shnum;
|
||||
if (tmp >= (SHN_LORESERVE & 0xffff))
|
||||
@ -701,6 +704,14 @@ elf_object_p (bfd *abfd)
|
||||
goto got_wrong_format_error;
|
||||
}
|
||||
|
||||
/* And program headers. */
|
||||
if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
|
||||
{
|
||||
i_ehdrp->e_phnum = i_shdr.sh_info;
|
||||
if (i_ehdrp->e_phnum != i_shdr.sh_info)
|
||||
goto got_wrong_format_error;
|
||||
}
|
||||
|
||||
/* Sanity check that we can read all of the section headers.
|
||||
It ought to be good enough to just read the last one. */
|
||||
if (i_ehdrp->e_shnum != 1)
|
||||
@ -1072,6 +1083,8 @@ elf_write_shdrs_and_ehdr (bfd *abfd)
|
||||
|
||||
/* Some fields in the first section header handle overflow of ehdr
|
||||
fields. */
|
||||
if (i_ehdrp->e_phnum >= PN_XNUM)
|
||||
i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
|
||||
if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
|
||||
i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
|
||||
if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
|
||||
|
Reference in New Issue
Block a user