diff options
author | Maciej W. Rozycki <macro@linux-mips.org> | 2009-06-16 01:52:13 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@linux-mips.org> | 2009-06-16 01:52:13 +0000 |
commit | 7b6021f1972b04daee9d9afd467be3e1782c2158 (patch) | |
tree | f77665f0443fa451e57df1f6677ab2c69d1fa0f6 /gas | |
parent | b9f026bcd53ac6ec1171f4699d10e2a6e3a4e0bd (diff) | |
download | gdb-7b6021f1972b04daee9d9afd467be3e1782c2158.zip gdb-7b6021f1972b04daee9d9afd467be3e1782c2158.tar.gz gdb-7b6021f1972b04daee9d9afd467be3e1782c2158.tar.bz2 |
bfd/
* elf32-vax.c (elf_vax_check_relocs): Handle the visibility
attribute.
(elf_vax_relocate_section): Likewise.
gas/
* config/tc-vax.c (md_estimate_size_before_relax): Accept
indirect symbol references in the PIC mode and emit a
PC-relative relocation instead of a GOT/PLT one. Likewise
for symbols known to be hidden at this point.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-vax.c | 29 |
2 files changed, 20 insertions, 16 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 04e73ad..ed478c6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2009-06-16 Maciej W. Rozycki <macro@linux-mips.org> + + * config/tc-vax.c (md_estimate_size_before_relax): Accept + indirect symbol references in the PIC mode and emit a + PC-relative relocation instead of a GOT/PLT one. Likewise + for symbols known to be hidden at this point. + 2009-06-15 Nick Clifton <nickc@redhat.com> PR 10186 diff --git a/gas/config/tc-vax.c b/gas/config/tc-vax.c index db2055e..ec83657 100644 --- a/gas/config/tc-vax.c +++ b/gas/config/tc-vax.c @@ -396,23 +396,20 @@ md_estimate_size_before_relax (fragS *fragP, segT segment) || S_IS_WEAK (fragP->fr_symbol) || S_IS_EXTERNAL (fragP->fr_symbol))) { - if (p[0] & 0x10) - { - if (flag_want_pic) - as_fatal ("PIC reference to %s is indirect.\n", - S_GET_NAME (fragP->fr_symbol)); - } + /* Indirect references cannot go through the GOT or PLT, + let's hope they'll become local in the final link. */ + if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol)) + != STV_DEFAULT) + || (p[0] & 0x10)) + reloc_type = BFD_RELOC_32_PCREL; + else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS + || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG + || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB + || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP + || S_IS_FUNCTION (fragP->fr_symbol)) + reloc_type = BFD_RELOC_32_PLT_PCREL; else - { - if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS - || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG - || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB - || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP - || S_IS_FUNCTION (fragP->fr_symbol)) - reloc_type = BFD_RELOC_32_PLT_PCREL; - else - reloc_type = BFD_RELOC_32_GOT_PCREL; - } + reloc_type = BFD_RELOC_32_GOT_PCREL; } #endif switch (RELAX_STATE (fragP->fr_subtype)) |