* simple.c (bfd_simple_get_relocated_section_contents): Don't

change reloc_done.  Set and restore _cooked_size.
	(RETURN): Delete.
This commit is contained in:
Alan Modra 2004-04-16 03:29:13 +00:00
parent dc718098ad
commit 57a1784ed8
2 changed files with 19 additions and 27 deletions

View file

@ -1,3 +1,9 @@
2004-04-16 Alan Modra <amodra@bigpond.net.au>
* 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 <kettenis@gnu.org>
* netbsd-core.c (netbsd_core_file_p): Set architecture for VAX

View file

@ -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;
}