diff options
author | Alan Modra <amodra@gmail.com> | 2010-01-19 13:50:55 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2010-01-19 13:50:55 +0000 |
commit | ecd12bc14d85421fcf992cda5af1d534cc8736e0 (patch) | |
tree | 8500eab75a7a402d156e7beda24827422b6c16a8 /bfd/elfcode.h | |
parent | c75a08aa7c3ae2b586e5f29f00e01b702a9b5f3d (diff) | |
download | gdb-ecd12bc14d85421fcf992cda5af1d534cc8736e0.zip gdb-ecd12bc14d85421fcf992cda5af1d534cc8736e0.tar.gz gdb-ecd12bc14d85421fcf992cda5af1d534cc8736e0.tar.bz2 |
* 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.
Diffstat (limited to 'bfd/elfcode.h')
-rw-r--r-- | bfd/elfcode.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/bfd/elfcode.h b/bfd/elfcode.h index ecdc2de..07ad3c9 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -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)) |