On Thu, Jul 30, 2009 at 11:49:23AM -0700, David VomLehn wrote:
To: GCC Help Mailing List <firstname.lastname@example.org>,
Linux MIPS Mailing List <email@example.com>
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
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
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.