aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Keating <geoffk@geoffk.org>2000-09-06 21:21:51 +0000
committerGeoffrey Keating <geoffk@geoffk.org>2000-09-06 21:21:51 +0000
commit492055e63351f3e50634e94b60bb146ede9a537b (patch)
treee88a93bda19b367ce78974e97c58d25a07a21ebd
parent566ad7d7ea28f14f3c005daaa916a437e2a60e93 (diff)
downloadgdb-492055e63351f3e50634e94b60bb146ede9a537b.zip
gdb-492055e63351f3e50634e94b60bb146ede9a537b.tar.gz
gdb-492055e63351f3e50634e94b60bb146ede9a537b.tar.bz2
* 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.
-rw-r--r--bfd/ChangeLog15
-rw-r--r--bfd/coff-rs6000.c13
-rw-r--r--bfd/xcofflink.c26
3 files changed, 45 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index bda3212..3da3416 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c
index dec690c..bd93059 100644
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -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
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c
index f518fdf..4b265cc 100644
--- a/bfd/xcofflink.c
+++ b/bfd/xcofflink.c
@@ -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)