From: Alan Modra Date: Fri, 16 Apr 2004 03:29:13 +0000 (+0000) Subject: * simple.c (bfd_simple_get_relocated_section_contents): Don't X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=57a1784ed8fb404cd444134a16921a40163692ec;p=binutils-gdb.git * simple.c (bfd_simple_get_relocated_section_contents): Don't change reloc_done. Set and restore _cooked_size. (RETURN): Delete. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f12dc095472..f128442c9eb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2004-04-16 Alan Modra + + * simple.c (bfd_simple_get_relocated_section_contents): Don't + change reloc_done. Set and restore _cooked_size. + (RETURN): Delete. + 2004-04-15 Mark Kettenis * netbsd-core.c (netbsd_core_file_p): Set architecture for VAX diff --git a/bfd/simple.c b/bfd/simple.c index 4b597a4a334..fc2472eefd2 100644 --- a/bfd/simple.c +++ b/bfd/simple.c @@ -1,5 +1,5 @@ /* simple.c -- BFD simple client routines - Copyright 2002, 2003 + Copyright 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by MontaVista Software, Inc. @@ -140,28 +140,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, bfd_byte *contents, *data; int storage_needed; void *saved_offsets; - bfd_boolean saved_reloc_done = sec->reloc_done; - -#undef RETURN -#define RETURN(x) \ - do \ - { \ - sec->reloc_done = saved_reloc_done; \ - return (x); \ - } \ - while (0) - - /* Foul hack to prevent bfd_section_size aborts. The reloc_done flag - only controls that macro (and the related size macros), selecting - between _raw_size and _cooked_size. We may be called with relocation - done or not, so we need to save the done-flag and mark the section as - not relocated. - - Debug sections won't change size while we're only relocating. There - may be trouble here someday if it tries to run relaxation - unexpectedly, so make sure. */ - BFD_ASSERT (sec->_raw_size == sec->_cooked_size); - sec->reloc_done = 0; + bfd_size_type old_cooked_size; if (! (sec->flags & SEC_RELOC)) { @@ -175,7 +154,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, if (contents) bfd_get_section_contents (abfd, sec, contents, 0, size); - RETURN (contents); + return contents; } /* In order to use bfd_get_relocated_section_contents, we need @@ -205,7 +184,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, { data = bfd_malloc (bfd_section_size (abfd, sec)); if (data == NULL) - RETURN (NULL); + return NULL; outbuf = data; } @@ -224,7 +203,7 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, { if (data) free (data); - RETURN (NULL); + return NULL; } bfd_map_over_sections (abfd, simple_save_output_info, saved_offsets); @@ -239,6 +218,12 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, else storage_needed = 0; + /* This function might be called before _cooked_size has been set, and + bfd_perform_relocation needs _cooked_size to be valid. */ + old_cooked_size = sec->_cooked_size; + if (old_cooked_size == 0) + sec->_cooked_size = sec->_raw_size; + contents = bfd_get_relocated_section_contents (abfd, &link_info, &link_order, @@ -262,10 +247,11 @@ bfd_simple_get_relocated_section_contents (bfd *abfd, free (symbol_table); #endif + sec->_cooked_size = old_cooked_size; bfd_map_over_sections (abfd, simple_restore_output_info, saved_offsets); free (saved_offsets); _bfd_generic_link_hash_table_free (link_info.hash); - RETURN (contents); + return contents; }