Now pseudo instruction la $6, symbol+8($6) is expanding into the following chain of commands:
lw $1, %got(symbol+8)($gp) addiu $1, $1, 8 addu $6, $1, $6
This is incorrect. When a linker handles the R_MIPS_GOT16 relocation, it does not expect to get any addend and breaks on assertion. Otherwise it has to create new GOT entry for each unique "sym + offset" pair. Offset for a global symbol should be added to result of loading GOT entry by a separate add command.
The patch fixes the problem by stripping off an offset from the expression passed to the %got. That's interesting that even current code inserts a separate add command.