aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2003-07-09 11:50:16 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2003-07-09 11:50:16 +0000
commitd2fba50dd9b5c642037b6d12f1a39a28ede61dee (patch)
tree012fd93fd41264d9971f8b9bffd13b8e8414d46f
parent6eaa6adc99a33e9961fa926ad08430a59cc953cd (diff)
downloadfsf-binutils-gdb-d2fba50dd9b5c642037b6d12f1a39a28ede61dee.zip
fsf-binutils-gdb-d2fba50dd9b5c642037b6d12f1a39a28ede61dee.tar.gz
fsf-binutils-gdb-d2fba50dd9b5c642037b6d12f1a39a28ede61dee.tar.bz2
* bfd/elfxx-mips.c (mips_elf_create_dynamic_relocation): In SGI-
compatible objects, add the values of defined external symbols to the addend.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elfxx-mips.c13
2 files changed, 18 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6b5d783..b9f0b2e 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
2003-07-09 Richard Sandiford <rsandifo@redhat.com>
+ * bfd/elfxx-mips.c (mips_elf_create_dynamic_relocation): In SGI-
+ compatible objects, add the values of defined external symbols
+ to the addend.
+
+2003-07-09 Richard Sandiford <rsandifo@redhat.com>
+
* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_symbol): Always
initialize a GOT entry to the symbol's st_value.
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 986ba69..00dc084 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -3887,6 +3887,7 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
else
{
long indx;
+ bfd_boolean defined_p;
/* We must now calculate the dynamic symbol table index to use
in the relocation. */
@@ -3899,6 +3900,15 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
become local. */
if (indx == -1)
indx = 0;
+ if (SGI_COMPAT (output_bfd))
+ defined_p = ((h->root.elf_link_hash_flags
+ & ELF_LINK_HASH_DEF_REGULAR) != 0);
+ else
+ /* ??? glibc's ld.so just adds the final GOT entry to the
+ relocation field. It therefore treats relocs against
+ defined symbols in the same way as relocs against
+ undefined symbols. */
+ defined_p = FALSE;
}
else
{
@@ -3928,13 +3938,14 @@ mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
useful, after all. This should be a bit more efficient
as well. */
indx = 0;
+ defined_p = TRUE;
}
/* If the relocation was previously an absolute relocation and
this symbol will not be referred to by the relocation, we must
adjust it by the value we give it in the dynamic symbol table.
Otherwise leave the job up to the dynamic linker. */
- if (!indx && r_type != R_MIPS_REL32)
+ if (defined_p && r_type != R_MIPS_REL32)
*addendp += symbol;
/* The relocation is always an REL32 relocation because we don't