linux-mips
[Top] [All Lists]

Re: Relocation problem with MIPS kernel modules

To: David VomLehn <dvomlehn@cisco.com>
Subject: Re: Relocation problem with MIPS kernel modules
From: Ralf Baechle <ralf@linux-mips.org>
Date: Mon, 3 Aug 2009 10:20:30 +0100
Cc: GCC Help Mailing List <gcc-help@gcc.gnu.org>, Linux MIPS Mailing List <linux-mips@linux-mips.org>
In-reply-to: <20090730184923.GA27030@cuplxvomd02.corp.sa.net>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20090730184923.GA27030@cuplxvomd02.corp.sa.net>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.5.18 (2008-05-17)
On Thu, Jul 30, 2009 at 11:49:23AM -0700, David VomLehn wrote:

> To: GCC Help Mailing List <gcc-help@gcc.gnu.org>,
>       Linux MIPS Mailing List <linux-mips@linux-mips.org>
> 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

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