diff options
author | Jeff Law <law@redhat.com> | 1994-07-07 17:35:27 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1994-07-07 17:35:27 +0000 |
commit | 8fd04cbacc37bdd368e74be416a6473dd180610c (patch) | |
tree | d7c6c1e59452b08ab375ec9c8b3f810f109d551d /gas | |
parent | fd4913f1965afbbda3507f416a35d492e40409bd (diff) | |
download | gdb-8fd04cbacc37bdd368e74be416a6473dd180610c.zip gdb-8fd04cbacc37bdd368e74be416a6473dd180610c.tar.gz gdb-8fd04cbacc37bdd368e74be416a6473dd180610c.tar.bz2 |
* config/tc-hppa.c (hppa_fix_adjustable): Reject reductions for
symbols in DLT relative relocs.
(tc_gen_reloc): Zero out the addend field for DLT relative relocs.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-hppa.c | 38 |
2 files changed, 42 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index dc12732..eed29ea 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +Thu Jul 7 11:31:32 1994 Jeff Law (law@snake.cs.utah.edu) + + * config/tc-hppa.c (hppa_fix_adjustable): Reject reductions for + symbols in DLT relative relocs. + (tc_gen_reloc): Zero out the addend field for DLT relative relocs. + Wed Jul 6 01:07:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) * config/tc-ppc.c (ppc_tc): If not OBJ_COFF, force TOC entry to diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index c6780ad..4d2831f 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -2626,6 +2626,9 @@ tc_gen_reloc (section, fixp) /* Now, do any processing that is dependent on the relocation type. */ switch (code) { + case R_PARISC_DLTREL21L: + case R_PARISC_DLTREL14R: + case R_PARISC_DLTREL14F: case R_PARISC_PLABEL32: case R_PARISC_PLABEL21L: case R_PARISC_PLABEL14R: @@ -2633,7 +2636,11 @@ tc_gen_reloc (section, fixp) relocation should be either 0 (no static link) or 2 (static link required). - FIXME: We always assume no static link! */ + FIXME: We always assume no static link! + + We also slam a zero addend into the DLT relative relocs; + it doesn't make a lot of sense to use any addend since + it gets you a different (eg unknown) DLT entry. */ reloc->addend = 0; break; @@ -2673,13 +2680,18 @@ tc_gen_reloc (section, fixp) relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0); break; + case R_DLT_REL: case R_DATA_PLABEL: case R_CODE_PLABEL: /* For plabel relocations, the addend of the relocation should be either 0 (no static link) or 2 (static link required). - FIXME: We always assume no static link! */ + FIXME: We always assume no static link! + + We also slam a zero addend into the DLT relative relocs; + it doesn't make a lot of sense to use any addend since + it gets you a different (eg unknown) DLT entry. */ relocs[i]->addend = 0; break; @@ -6138,6 +6150,20 @@ pa_text (unused) adjusted. This so that the linker can know when/how to create argument relocation stubs for indirect calls and calls to static functions. + "T" field selectors create DLT relative fixups for accessing + globals and statics in PIC code; each DLT relative fixup creates + an entry in the DLT table. The entries contain the address of + the final target (eg accessing "foo" would create a DLT entry + with the address of "foo"). + + Unfortunately, the HP linker doesn't take into account any addend + when generating the DLT; so accessing $LIT$+8 puts the address of + $LIT$ into the DLT rather than the address of $LIT$+8. + + The end result is we can't perform relocation symbol reductions for + any fixup which creates entries in the DLT (eg they use "T" field + selectors). + FIXME. Also reject R_HPPA relocations which are 32 bits wide. Helps with code lables in arrays for SOM. (SOM BFD code needs to generate relocations to push the addend and symbol value @@ -6152,9 +6178,17 @@ hppa_fix_adjustable (fixp) hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data; + /* Reject reductions of symbols in 32bit plabel relocs. */ if (fixp->fx_r_type == R_HPPA && hppa_fix->fx_r_format == 32) return 0; + /* Reject reductions of symbols in DLT relative relocs. */ + if (hppa_fix->fx_r_field == e_tsel + || hppa_fix->fx_r_field == e_ltsel + || hppa_fix->fx_r_field == e_rtsel) + return 0; + + /* Reject reductions of function symbols. */ if (fixp->fx_addsy == 0 || (fixp->fx_addsy->bsym->flags & BSF_FUNCTION) == 0) return 1; |