X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fsimple.c;h=9a8397f83e971159adc09ee031145d6a6bbae771;hb=50e8a0d53b037c640e313d57ddbe88db8eeea5bb;hp=d2109dfb332d44e85fdd6f2cc92dc2cda839877b;hpb=53e09e0aaf3d13e4b893744e2fe79edde7edfd20;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/simple.c b/bfd/simple.c index d2109dfb33..9a8397f83e 100644 --- a/bfd/simple.c +++ b/bfd/simple.c @@ -1,5 +1,5 @@ /* simple.c -- BFD simple client routines - Copyright 2002, 2003, 2004, 2005 + Copyright 2002, 2003, 2004, 2005, 2007, 2008, 2009 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, @@ -17,10 +17,11 @@ 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., 59 Temple Place - Suite 330, 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" @@ -92,6 +93,11 @@ simple_dummy_multiple_definition (struct bfd_link_info *link_info ATTRIBUTE_UNUS return TRUE; } +static void +simple_dummy_einfo (const char *fmt ATTRIBUTE_UNUSED, ...) +{ +} + struct saved_output_info { bfd_vma offset; @@ -103,7 +109,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 @@ -119,7 +125,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; } @@ -156,13 +162,16 @@ 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); + contents = (bfd_byte *) bfd_malloc (amt); else contents = outbuf; @@ -177,7 +186,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; @@ -187,6 +198,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, callbacks.reloc_dangerous = simple_dummy_reloc_dangerous; callbacks.unattached_reloc = simple_dummy_unattached_reloc; callbacks.multiple_definition = simple_dummy_multiple_definition; + callbacks.einfo = simple_dummy_einfo; memset (&link_order, 0, sizeof (link_order)); link_order.next = NULL; @@ -198,7 +210,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; @@ -228,7 +241,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