On Thu, Jul 30, 2009 at 11:49:23AM -0700, David VomLehn wrote: > To: GCC Help Mailing List <gcc-help@xxxxxxxxxxx>, > Linux MIPS Mailing List <linux-mips@xxxxxxxxxxxxxx> > Subject: Relocation problem with MIPS kernel modules > Content-Type: text/plain; charset=us-ascii > > I have a MIPS loadable kernel module that, when I try to insmod it, causes the > kernel to emit the message: > > module xyz: dangerous relocation > > This message appears in three different places in arch/mips/kernel/module.c, > but this one is coming from apply_r_mips_lo16_rel(). The module code at I'll change the messages to indicate the relocation type. > the location at which the error message is generated appears to be pretty > bland: > lw v0,28564(s1) > with the expected relocation type of R_MIPS_LO16. The relocation before it > is R_MIPS_HI16, as expected, but for a different symbol. Before *that* > is another R_MIPS_HI16 relocation entry for yet a third symbol. > > According to the MIPS ABI, for what it's worth, "Each relocation type of > R_MIPS_HI16 must have an associated R_MIPS_LO16 entry immediately following > it in the list of relocations." So, what's actually getting generated by > gcc and linker differs from the closest thing we have to an ABI of record for > MIPS processors. The GNU tools as an extension over the MIPS ABI allows an arbitrary number of R_MIPS_HI16 relocations to be followed by a R_MIPS_LO16 symbol. All relocations of this sequence must use the same symbol, of course. This is a very old extension; I think it predates the Linux/MIPS port. Ralf