* elf32-hppa.c (final_link_relocate): For all DP relative relocations,

adjust addil instructions if the symbol has no section.
This commit is contained in:
Dave Anglin 2003-01-08 02:19:23 +00:00
parent 1e2330ba1f
commit 95d0f04a0b
2 changed files with 11 additions and 7 deletions

View 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> 2003-01-07 DJ Delorie <dj@redhat.com>
* elf32-xstormy16.c (xstormy16_elf_howto_table): Make REL_12 not * elf32-xstormy16.c (xstormy16_elf_howto_table): Make REL_12 not

View File

@ -3416,15 +3416,14 @@ final_link_relocate (input_section, contents, rel, value, htab, sym_sec, h)
case R_PARISC_DPREL14R: case R_PARISC_DPREL14R:
case R_PARISC_DPREL14F: case R_PARISC_DPREL14F:
/* For all the DP relative relocations, we need to examine the symbol's /* 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 section. If it has no section or if it's a code section, then
no sense. In that case we don't adjust the "value", and for 21 bit "data pointer relative" makes no sense. In that case we don't
addil instructions, we change the source addend register from %dp to adjust the "value", and for 21 bit addil instructions, we change the
%r0. This situation commonly arises when a variable's "constness" 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 is declared differently from the way the variable is defined. For
instance: "extern int foo" with foo defined as "const int foo". */ instance: "extern int foo" with foo defined as "const int foo". */
if (sym_sec == NULL) if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
break;
if ((sym_sec->flags & SEC_CODE) != 0)
{ {
if ((insn & ((0x3f << 26) | (0x1f << 21))) if ((insn & ((0x3f << 26) | (0x1f << 21)))
== (((int) OP_ADDIL << 26) | (27 << 21))) == (((int) OP_ADDIL << 26) | (27 << 21)))