* bfd-in.h (bfd_get_section_limit): Don't use rawsize with output

sections.
	* libbfd.c (_bfd_generic_get_section_contents): Likewise.
	(_bfd_generic_get_section_contents_in_window): Likewise.
	* section.c (bfd_get_section_contents): Likewise.
	* compress.c (bfd_get_full_section_contents): Likewise.
	* elf32-rx.c (rx_final_link): Ignore rawsize.
	* elf32-microblaze.c (microblaze_elf_relocate_section): Use correct
	bfd with bfd_get_section_limit.
	* elfxx-ia64.c (elfNN_ia64_choose_gp): Add "final" parameter.  Use
	os->size during final link.  Update callers.
	* bfd-in2.h: Regenerate.
This commit is contained in:
Alan Modra 2011-04-11 04:08:13 +00:00
parent 6edcf5b8e0
commit e57278ef9d
9 changed files with 62 additions and 25 deletions

View File

@ -1,3 +1,18 @@
2011-04-11 Alan Modra <amodra@gmail.com>
* bfd-in.h (bfd_get_section_limit): Don't use rawsize with output
sections.
* libbfd.c (_bfd_generic_get_section_contents): Likewise.
(_bfd_generic_get_section_contents_in_window): Likewise.
* section.c (bfd_get_section_contents): Likewise.
* compress.c (bfd_get_full_section_contents): Likewise.
* elf32-rx.c (rx_final_link): Ignore rawsize.
* elf32-microblaze.c (microblaze_elf_relocate_section): Use correct
bfd with bfd_get_section_limit.
* elfxx-ia64.c (elfNN_ia64_choose_gp): Add "final" parameter. Use
os->size during final link. Update callers.
* bfd-in2.h: Regenerate.
2011-04-10 Richard Sandiford <rdsandiford@googlemail.com>
PR ld/12637

View File

@ -1,7 +1,7 @@
/* Main header file for the bfd library -- portable access to object files.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Cygnus Support.
@ -291,8 +291,8 @@ typedef struct bfd_section *sec_ptr;
#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
/* Find the address one past the end of SEC. */
#define bfd_get_section_limit(bfd, sec) \
(((sec)->rawsize ? (sec)->rawsize : (sec)->size) \
/ bfd_octets_per_byte (bfd))
(((bfd)->direction != write_direction && (sec)->rawsize != 0 \
? (sec)->rawsize : (sec)->size) / bfd_octets_per_byte (bfd))
/* Return TRUE if input section SEC has been discarded. */
#define elf_discarded_section(sec) \

View File

@ -7,8 +7,8 @@
/* Main header file for the bfd library -- portable access to object files.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Cygnus Support.
@ -298,8 +298,8 @@ typedef struct bfd_section *sec_ptr;
#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE)
/* Find the address one past the end of SEC. */
#define bfd_get_section_limit(bfd, sec) \
(((sec)->rawsize ? (sec)->rawsize : (sec)->size) \
/ bfd_octets_per_byte (bfd))
(((bfd)->direction != write_direction && (sec)->rawsize != 0 \
? (sec)->rawsize : (sec)->size) / bfd_octets_per_byte (bfd))
/* Return TRUE if input section SEC has been discarded. */
#define elf_discarded_section(sec) \

View File

@ -1,5 +1,5 @@
/* Compressed section support (intended for debug sections).
Copyright 2008, 2010
Copyright 2008, 2010, 2011
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -158,7 +158,7 @@ DESCRIPTION
bfd_boolean
bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
{
bfd_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
bfd_size_type sz;
bfd_byte *p = *ptr;
#ifdef HAVE_ZLIB_H
bfd_boolean ret;
@ -169,6 +169,10 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
bfd_byte *uncompressed_buffer;
#endif
if (abfd->direction != write_direction && sec->rawsize != 0)
sz = sec->rawsize;
else
sz = sec->size;
if (sz == 0)
return TRUE;

View File

@ -1,6 +1,6 @@
/* Xilinx MicroBlaze-specific support for 32-bit ELF
Copyright 2009, 2010 Free Software Foundation, Inc.
Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -824,7 +824,7 @@ microblaze_elf_relocate_section (bfd *output_bfd,
}
/* Sanity check the address. */
if (offset > bfd_get_section_limit (output_bfd, input_section))
if (offset > bfd_get_section_limit (input_bfd, input_section))
{
r = bfd_reloc_outofrange;
goto check_reloc;

View File

@ -1,5 +1,5 @@
/* Renesas RX specific support for 32-bit ELF.
Copyright (C) 2008, 2009, 2010
Copyright (C) 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -3305,13 +3305,12 @@ rx_final_link (bfd * abfd, struct bfd_link_info * info)
#endif
if (o->flags & SEC_CODE
&& bfd_big_endian (abfd)
&& (o->size % 4 || o->rawsize % 4))
&& o->size % 4)
{
#ifdef DJDEBUG
fprintf (stderr, "adjusting...\n");
#endif
o->size += 4 - (o->size % 4);
o->rawsize += 4 - (o->rawsize % 4);
}
}

View File

@ -1,6 +1,6 @@
/* IA-64 support for 64-bit ELF
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010 Free Software Foundation, Inc.
2008, 2009, 2010, 2011 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
This file is part of BFD, the Binary File Descriptor library.
@ -215,7 +215,7 @@ static bfd_boolean elfNN_ia64_dynamic_symbol_p
static bfd_reloc_status_type elfNN_ia64_install_value
(bfd_byte *hit_addr, bfd_vma val, unsigned int r_type);
static bfd_boolean elfNN_ia64_choose_gp
(bfd *abfd, struct bfd_link_info *info);
(bfd *abfd, struct bfd_link_info *info, bfd_boolean final);
static void elfNN_ia64_relax_ldxmov
(bfd_byte *contents, bfd_vma off);
static void elfNN_ia64_dyn_sym_traverse
@ -1221,7 +1221,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
gp = _bfd_get_gp_value (obfd);
if (gp == 0)
{
if (!elfNN_ia64_choose_gp (obfd, link_info))
if (!elfNN_ia64_choose_gp (obfd, link_info, FALSE))
goto error_return;
gp = _bfd_get_gp_value (obfd);
}
@ -4298,7 +4298,7 @@ elfNN_ia64_unwind_entry_compare (const PTR a, const PTR b)
/* Make sure we've got ourselves a nice fat __gp value. */
static bfd_boolean
elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info)
elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bfd_boolean final)
{
bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
bfd_vma min_short_vma = min_vma, max_short_vma = 0;
@ -4321,7 +4321,12 @@ elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info)
continue;
lo = os->vma;
hi = os->vma + (os->rawsize ? os->rawsize : os->size);
/* When this function is called from elfNN_ia64_final_link
the correct value to use is os->size. When called from
elfNN_ia64_relax_section we are in the middle of section
sizing; some sections will already have os->size set, others
will have os->size zero and os->rawsize the previous size. */
hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
if (hi < lo)
hi = (bfd_vma) -1;
@ -4462,7 +4467,7 @@ elfNN_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
/* We assume after gp is set, section size will only decrease. We
need to adjust gp for it. */
_bfd_set_gp_value (abfd, 0);
if (! elfNN_ia64_choose_gp (abfd, info))
if (! elfNN_ia64_choose_gp (abfd, info, TRUE))
return FALSE;
gp_val = _bfd_get_gp_value (abfd);

View File

@ -866,7 +866,15 @@ _bfd_generic_get_section_contents (bfd *abfd,
return FALSE;
}
sz = section->rawsize ? section->rawsize : section->size;
/* We do allow reading of a section after bfd_final_link has
written the contents out to disk. In that situation, rawsize is
just a stale version of size, so ignore it. Otherwise we must be
reading an input section, where rawsize, if different to size,
is the on-disk size. */
if (abfd->direction != write_direction && section->rawsize != 0)
sz = section->rawsize;
else
sz = section->size;
if (offset + count < count
|| offset + count > sz)
{
@ -919,7 +927,10 @@ _bfd_generic_get_section_contents_in_window
w->data = w->i->data;
return bfd_get_section_contents (abfd, section, w->data, offset, count);
}
sz = section->rawsize ? section->rawsize : section->size;
if (abfd->direction != write_direction && section->rawsize != 0)
sz = section->rawsize;
else
sz = section->size;
if (offset + count > sz
|| ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
TRUE))

View File

@ -1,6 +1,6 @@
/* Object file "section" support for the BFD library.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Written by Cygnus Support.
@ -1456,7 +1456,10 @@ bfd_get_section_contents (bfd *abfd,
return TRUE;
}
sz = section->rawsize ? section->rawsize : section->size;
if (abfd->direction != write_direction && section->rawsize != 0)
sz = section->rawsize;
else
sz = section->size;
if ((bfd_size_type) offset > sz
|| count > sz
|| offset + count > sz