* elf32-hppa.c (final_link_relocate): For all DP relative relocations,
authorDave Anglin <dave.anglin@nrc.ca>
Wed, 8 Jan 2003 02:19:23 +0000 (02:19 +0000)
committerDave Anglin <dave.anglin@nrc.ca>
Wed, 8 Jan 2003 02:19:23 +0000 (02:19 +0000)
adjust addil instructions if the symbol has no section.

bfd/ChangeLog
bfd/elf32-hppa.c

index fde02c865654727142e11364c72216ebc0a8fb42..81f78a0010aff564a407e75873da82fd8ff974c2 100644 (file)
@@ -1,3 +1,8 @@
+2003-01-07  John David Anglin  <dave.anglin@nrc.gc.ca>
+
+       * elf32-hppa.c (final_link_relocate): For all DP relative relocations,
+       adjust addil instructions if the symbol has no section.
+
 2003-01-07  DJ Delorie  <dj@redhat.com>
 
        * elf32-xstormy16.c (xstormy16_elf_howto_table): Make REL_12 not
index f8c88b15583b455802bb73c11d8ee4ae47ae161f..2646f3dc4ed6b72f030e438f078297fbf3c18b88 100644 (file)
@@ -3416,15 +3416,14 @@ final_link_relocate (input_section, contents, rel, value, htab, sym_sec, h)
     case R_PARISC_DPREL14R:
     case R_PARISC_DPREL14F:
     /* For all the DP relative relocations, we need to examine the symbol's
-       section.  If it's a code section, then "data pointer relative" makes
-       no sense.  In that case we don't adjust the "value", and for 21 bit
-       addil instructions, we change the source addend register from %dp to
-       %r0.  This situation commonly arises when a variable's "constness"
+       section.  If it has no section or if it's a code section, then
+       "data pointer relative" makes no sense.  In that case we don't
+       adjust the "value", and for 21 bit addil instructions, we change the
+       source addend register from %dp to %r0.  This situation commonly
+       arises for undefined weak symbols and when a variable's "constness"
        is declared differently from the way the variable is defined.  For
        instance: "extern int foo" with foo defined as "const int foo".  */
-      if (sym_sec == NULL)
-       break;
-      if ((sym_sec->flags & SEC_CODE) != 0)
+      if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
        {
          if ((insn & ((0x3f << 26) | (0x1f << 21)))
              == (((int) OP_ADDIL << 26) | (27 << 21)))