[Top] [All Lists]

Re: Relocation problem with MIPS kernel modules

To: Ralf Baechle <>
Subject: Re: Relocation problem with MIPS kernel modules
From: David Daney <>
Date: Mon, 03 Aug 2009 12:33:25 -0700
Cc: David VomLehn <>, GCC Help Mailing List <>, Linux MIPS Mailing List <>
In-reply-to: <>
Original-recipient: rfc822;
References: <> <>
User-agent: Thunderbird (X11/20090320)
Ralf Baechle wrote:
On Thu, Jul 30, 2009 at 11:49:23AM -0700, David VomLehn wrote:

To: GCC Help Mailing List <>,
        Linux MIPS Mailing List <>
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
        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.

Actually I think it is the opposite:

OFFSET   TYPE              VALUE
00000000 R_MIPS_HI16       .bss+0x00000004
00000008 R_MIPS_LO16       .bss+0x00000004
00000014 R_MIPS_LO16       .bss+0x00000004

We load the hi16 value into a register and then use multiple lo16 offsets for the follow loads and stores to the same location. On a read-modify-write we only want to load the base address one time.

David Daney

<Prev in Thread] Current Thread [Next in Thread>