David Daney <[EMAIL PROTECTED]> writes: > Ian Lance Taylor wrote: > > David Daney <[EMAIL PROTECTED]> writes: > > > >>I am going to try to fix: > >> > >>http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29721 > >> > >>Which is a problem where a %lo relocation gets separated from its > >>corresponding %hi. > >> > >>What is the mechanism that tries to prevent this from happening? And > >>where is it implemented? > > This implemented by having the assembler sort the relocations so that > > each %lo relocations follows the appropriate set of %hi relocations. > > It is implemented in gas/config/tc-mips.c in append_insn. Look for > > reloc_needs_lo_p and mips_frob_file. > > At first glance the assembler does appear to handle %got correctly, > > so > > I'm not sure why it is failing for you. > > Did you look at the assembly fragment in the PR? > > Is it correct in that there is a pair of %got/%lo in the middle of > another %got/%lo pair?
Sure, why not? They can be disambiguated by looking at which symbol the %got/%lo applies to. That is just what the assembler reloc sorting implements in mips_frob_file. (Or, at least, is supposed to implement, though apparently something is going wrong in your case.) The assembler sorts the relocations so that the linker always see the %lo reloc immediately after the corresponding %got reloc(s). Ian