* xcofflink.c (xcoff_link_input_bfd): Include the .tocbss
pseduo-section when determining where the TOC ends. * coff-rs6000.c (_bfd_xcoff_swap_aux_out): Use bfd_h_put_16 to output x_tvndx as it is only two bytes wide. * coff-rs6000.c (xcoff_howto_table): A modifiable branch-absolute reloc is 26 or 32 bits wide. * coff-rs6000.c (_bfd_xcoff_rtype2howto): The bitsize is irrelevant for relocs that don't change anything. Also look at the full 6 bits of bitsize.
This commit is contained in:
parent
566ad7d7ea
commit
492055e633
|
@ -1,3 +1,18 @@
|
|||
2000-09-06 Geoffrey Keating <geoffk@cygnus.com>
|
||||
|
||||
* xcofflink.c (xcoff_link_input_bfd): Include the .tocbss
|
||||
pseduo-section when determining where the TOC ends.
|
||||
|
||||
* coff-rs6000.c (_bfd_xcoff_swap_aux_out): Use bfd_h_put_16 to
|
||||
output x_tvndx as it is only two bytes wide.
|
||||
|
||||
* coff-rs6000.c (xcoff_howto_table): A modifiable branch-absolute
|
||||
reloc is 26 or 32 bits wide.
|
||||
|
||||
* coff-rs6000.c (_bfd_xcoff_rtype2howto): The bitsize is irrelevant
|
||||
for relocs that don't change anything. Also look at the full
|
||||
6 bits of bitsize.
|
||||
|
||||
2000-09-06 Philip Blundell <philb@gnu.org>
|
||||
|
||||
* config.bfd (arm*-*-uclinux*): New target.
|
||||
|
|
|
@ -373,7 +373,7 @@ _bfd_xcoff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
|
|||
}
|
||||
|
||||
PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
|
||||
PUTWORD(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
|
||||
bfd_h_put_16 (abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
|
||||
|
||||
if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
|
||||
{
|
||||
|
@ -708,7 +708,7 @@ reloc_howto_type xcoff_howto_table[] =
|
|||
HOWTO (0x18, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
26, /* bitsize */
|
||||
false, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
|
@ -723,7 +723,7 @@ reloc_howto_type xcoff_howto_table[] =
|
|||
HOWTO (0x19, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
16, /* bitsize */
|
||||
32, /* bitsize */
|
||||
false, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
|
@ -843,8 +843,11 @@ _bfd_xcoff_rtype2howto (relent, internal)
|
|||
/* The r_size field of an XCOFF reloc encodes the bitsize of the
|
||||
relocation, as well as indicating whether it is signed or not.
|
||||
Doublecheck that the relocation information gathered from the
|
||||
type matches this information. */
|
||||
if (relent->howto->bitsize != ((unsigned int) internal->r_size & 0x1f) + 1)
|
||||
type matches this information. The bitsize is not significant
|
||||
for R_REF relocs. */
|
||||
if (relent->howto->dst_mask != 0
|
||||
&& (relent->howto->bitsize
|
||||
!= ((unsigned int) internal->r_size & 0x3f) + 1))
|
||||
abort ();
|
||||
#if 0
|
||||
if ((internal->r_size & 0x80) != 0
|
||||
|
|
|
@ -4679,22 +4679,40 @@ xcoff_link_input_bfd (finfo, input_bfd)
|
|||
else
|
||||
{
|
||||
bfd_vma tocval, tocend;
|
||||
bfd *inp;
|
||||
|
||||
tocval = ((*csectpp)->output_section->vma
|
||||
+ (*csectpp)->output_offset
|
||||
+ isym.n_value
|
||||
- (*csectpp)->vma);
|
||||
|
||||
/* We want to find out if tocval is a good value to use
|
||||
as the TOC anchor--that is, whether we can access all
|
||||
of the TOC using a 16 bit offset from tocval. This
|
||||
test assumes that the TOC comes at the end of the
|
||||
output section, as it does in the default linker
|
||||
script. FIXME: This doesn't handle .tocbss sections
|
||||
created from XMC_TD common symbols correctly. */
|
||||
|
||||
script. */
|
||||
tocend = ((*csectpp)->output_section->vma
|
||||
+ (*csectpp)->output_section->_raw_size);
|
||||
|
||||
for (inp = finfo->info->input_bfds;
|
||||
inp != NULL;
|
||||
inp = inp->link_next)
|
||||
{
|
||||
asection *o;
|
||||
|
||||
for (o = inp->sections; o != NULL; o = o->next)
|
||||
if (strcmp (o->name, ".tocbss") == 0)
|
||||
{
|
||||
bfd_vma new_toc_end;
|
||||
new_toc_end = (o->output_section->vma
|
||||
+ o->output_offset
|
||||
+ o->_cooked_size);
|
||||
if (new_toc_end > tocend)
|
||||
tocend = new_toc_end;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (tocval + 0x10000 < tocend)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
|
|
Loading…
Reference in New Issue