* 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:
parent
6edcf5b8e0
commit
e57278ef9d
@ -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
|
||||
|
@ -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) \
|
||||
|
@ -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) \
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
15
bfd/libbfd.c
15
bfd/libbfd.c
@ -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))
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user