daily update
[deliverable/binutils-gdb.git] / bfd / elfcode.h
index 3c295502df70658a40202fdbedc53f515dfa0ae0..d2f4751e95fa1bdb80a215a8fd0fda7c4447dc79 100644 (file)
@@ -1,6 +1,7 @@
 /* ELF executable support for BFD.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
    Meissner (Open Software Foundation), and Peter Hoogenboom (University
    of Utah) to finish and extend this.
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* Problems and other issues to resolve.
 
@@ -64,8 +67,8 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
        it's cast in stone.
  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libiberty.h"
 #include "bfdlink.h"
 #include "libbfd.h"
@@ -119,6 +122,7 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 #define elf_find_section               NAME(bfd_elf,find_section)
 #define elf_write_shdrs_and_ehdr       NAME(bfd_elf,write_shdrs_and_ehdr)
 #define elf_write_out_phdrs            NAME(bfd_elf,write_out_phdrs)
+#define elf_checksum_contents          NAME(bfd_elf,checksum_contents)
 #define elf_write_relocs               NAME(bfd_elf,write_relocs)
 #define elf_slurp_reloc_table          NAME(bfd_elf,slurp_reloc_table)
 
@@ -468,7 +472,7 @@ 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:
@@ -1102,6 +1106,53 @@ elf_write_shdrs_and_ehdr (bfd *abfd)
   return TRUE;
 }
 
+bfd_boolean
+elf_checksum_contents (bfd *abfd,
+                      void (*process) (const void *, size_t, void *),
+                      void *arg)
+{
+  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
+  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
+  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
+  unsigned int count, num;
+
+  {
+    Elf_External_Ehdr x_ehdr;
+    Elf_Internal_Ehdr i_ehdr;
+
+    i_ehdr = *i_ehdrp;
+    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
+    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
+    (*process) (&x_ehdr, sizeof x_ehdr, arg);
+  }
+
+  num = i_ehdrp->e_phnum;
+  for (count = 0; count < num; count++)
+    {
+      Elf_External_Phdr x_phdr;
+      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
+      (*process) (&x_phdr, sizeof x_phdr, arg);
+    }
+
+  num = elf_numsections (abfd);
+  for (count = 0; count < num; count++)
+    {
+      Elf_Internal_Shdr i_shdr;
+      Elf_External_Shdr x_shdr;
+
+      i_shdr = *i_shdrp[count];
+      i_shdr.sh_offset = 0;
+
+      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
+      (*process) (&x_shdr, sizeof x_shdr, arg);
+
+      if (i_shdr.contents)
+       (*process) (i_shdr.contents, i_shdr.sh_size, arg);
+    }
+
+  return TRUE;
+}
+
 long
 elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
 {
@@ -1800,6 +1851,7 @@ const struct elf_size_info NAME(_bfd_elf,size_info) = {
   ELFCLASS, EV_CURRENT,
   elf_write_out_phdrs,
   elf_write_shdrs_and_ehdr,
+  elf_checksum_contents,
   elf_write_relocs,
   elf_swap_symbol_in,
   elf_swap_symbol_out,
This page took 0.026198 seconds and 4 git commands to generate.