2011-05-09 Paul Brook <paul@codesourcery.com>
[deliverable/binutils-gdb.git] / bfd / simple.c
index d06ce2a96e11535e995a369bc1bf4b8ec9d72b65..e5a5b58f92b09e3e89eb3975b927fb58916466f9 100644 (file)
@@ -1,5 +1,5 @@
 /* simple.c -- BFD simple client routines
-   Copyright 2002, 2003, 2004, 2005
+   Copyright 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Contributed by MontaVista Software, Inc.
 
@@ -7,7 +7,7 @@
 
    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
+   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,
 
    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.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "bfdlink.h"
 
@@ -81,10 +82,7 @@ simple_dummy_unattached_reloc (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
 
 static bfd_boolean
 simple_dummy_multiple_definition (struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
-                                 const char *name ATTRIBUTE_UNUSED,
-                                 bfd *obfd ATTRIBUTE_UNUSED,
-                                 asection *osec ATTRIBUTE_UNUSED,
-                                 bfd_vma oval ATTRIBUTE_UNUSED,
+                                 struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
                                  bfd *nbfd ATTRIBUTE_UNUSED,
                                  asection *nsec ATTRIBUTE_UNUSED,
                                  bfd_vma nval ATTRIBUTE_UNUSED)
@@ -108,7 +106,7 @@ simple_save_output_info (bfd *abfd ATTRIBUTE_UNUSED,
                         asection *section,
                         void *ptr)
 {
-  struct saved_output_info *output_info = ptr;
+  struct saved_output_info *output_info = (struct saved_output_info *) ptr;
   output_info[section->index].offset = section->output_offset;
   output_info[section->index].section = section->output_section;
   if ((section->flags & SEC_DEBUGGING) != 0
@@ -124,7 +122,7 @@ simple_restore_output_info (bfd *abfd ATTRIBUTE_UNUSED,
                            asection *section,
                            void *ptr)
 {
-  struct saved_output_info *output_info = ptr;
+  struct saved_output_info *output_info = (struct saved_output_info *) ptr;
   section->output_offset = output_info[section->index].offset;
   section->output_section = output_info[section->index].section;
 }
@@ -161,19 +159,14 @@ bfd_simple_get_relocated_section_contents (bfd *abfd,
   int storage_needed;
   void *saved_offsets;
 
-  if (! (sec->flags & SEC_RELOC))
+  /* Don't apply relocation on executable and shared library.  See
+     PR 4756.  */
+  if ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC)) != HAS_RELOC
+      || ! (sec->flags & SEC_RELOC))
     {
-      bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size;
-      bfd_size_type size = sec->rawsize ? sec->rawsize : sec->size;
-
-      if (outbuf == NULL)
-       contents = bfd_malloc (amt);
-      else
-       contents = outbuf;
-
-      if (contents)
-       bfd_get_section_contents (abfd, sec, contents, 0, size);
-
+      contents = outbuf;
+      if (!bfd_get_full_section_contents (abfd, sec, &contents))
+       return NULL;
       return contents;
     }
 
@@ -182,7 +175,9 @@ bfd_simple_get_relocated_section_contents (bfd *abfd,
 
   /* Fill in the bare minimum number of fields for our purposes.  */
   memset (&link_info, 0, sizeof (link_info));
+  link_info.output_bfd = abfd;
   link_info.input_bfds = abfd;
+  link_info.input_bfds_tail = &abfd->link_next;
 
   link_info.hash = _bfd_generic_link_hash_table_create (abfd);
   link_info.callbacks = &callbacks;
@@ -204,7 +199,8 @@ bfd_simple_get_relocated_section_contents (bfd *abfd,
   data = NULL;
   if (outbuf == NULL)
     {
-      data = bfd_malloc (sec->size);
+      bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size;
+      data = (bfd_byte *) bfd_malloc (amt);
       if (data == NULL)
        return NULL;
       outbuf = data;
@@ -234,7 +230,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd,
       _bfd_generic_link_add_symbols (abfd, &link_info);
 
       storage_needed = bfd_get_symtab_upper_bound (abfd);
-      symbol_table = bfd_malloc (storage_needed);
+      symbol_table = (asymbol **) bfd_malloc (storage_needed);
       bfd_canonicalize_symtab (abfd, symbol_table);
     }
   else
This page took 0.031458 seconds and 4 git commands to generate.