diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2004-07-08 15:39:43 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2004-07-08 15:39:43 +0000 |
commit | de7e6852134391ba8229ba9305e575ba34afaf59 (patch) | |
tree | f18bf631c0d2b3d6fe9bd969afcea565173bdd2e /gas/config/tc-mips.c | |
parent | 1544280f1d3c2d72202a5daec14e7e7277efbc5a (diff) | |
download | gdb-de7e6852134391ba8229ba9305e575ba34afaf59.zip gdb-de7e6852134391ba8229ba9305e575ba34afaf59.tar.gz gdb-de7e6852134391ba8229ba9305e575ba34afaf59.tar.bz2 |
* config/tc-mips.c (mips_fix_adjustable): If the full addend is
going to be split into more than one in-place addend, return 0
for relocations against mergeable sections. Associate comments
with code.
Diffstat (limited to 'gas/config/tc-mips.c')
-rw-r--r-- | gas/config/tc-mips.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index c554ba1..ab18cfd 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -12733,15 +12733,13 @@ md_estimate_size_before_relax (fragS *fragp, asection *segtype) } /* This is called to see whether a reloc against a defined symbol - should be converted into a reloc against a section. Don't adjust - MIPS16 jump relocations, so we don't have to worry about the format - of the offset in the .o file. Don't adjust relocations against - mips16 symbols, so that the linker can find them if it needs to set - up a stub. */ + should be converted into a reloc against a section. */ int mips_fix_adjustable (fixS *fixp) { + /* Don't adjust MIPS16 jump relocations, so we don't have to worry + about the format of the offset in the .o file. */ if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP) return 0; @@ -12752,7 +12750,28 @@ mips_fix_adjustable (fixS *fixp) if (fixp->fx_addsy == NULL) return 1; + /* If symbol SYM is in a mergeable section, relocations of the form + SYM + 0 can usually be made section-relative. The mergeable data + is then identified by the section offset rather than by the symbol. + + However, if we're generating REL LO16 relocations, the offset is split + between the LO16 and parterning high part relocation. The linker will + need to recalculate the complete offset in order to correctly identify + the merge data. + + The linker has traditionally not looked for the parterning high part + relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be + placed anywhere. Rather than break backwards compatibility by changing + this, it seems better not to force the issue, and instead keep the + original symbol. This will work with either linker behavior. */ + if ((fixp->fx_r_type == BFD_RELOC_LO16 || reloc_needs_lo_p (fixp->fx_r_type)) + && HAVE_IN_PLACE_ADDENDS + && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0) + return 0; + #ifdef OBJ_ELF + /* Don't adjust relocations against mips16 symbols, so that the linker + can find them if it needs to set up a stub. */ if (OUTPUT_FLAVOR == bfd_target_elf_flavour && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16 && fixp->fx_subsy == NULL) |