linux-mips-fnet
[Top] [All Lists]

Re: MIPS/ELF linker

To: Mark Mitchell <mark@codesourcery.com>
Subject: Re: MIPS/ELF linker
From: Ralf Baechle <ralf@uni-koblenz.de>
Date: Sun, 1 Aug 1999 01:22:03 +0200
Cc: ralf@gnu.org, binutils@sourceware.cygnus.com, thockin@cobaltnet.com, linux@engr.sgi.com, linux-mips@fnet.fr, linux-mips@vger.rutgers.edu
In-reply-to: <19990731152842N.mitchell@codesourcery.com>; from Mark Mitchell on Sat, Jul 31, 1999 at 03:28:42PM -0700
References: <19990731233150.Q12249@uni-koblenz.de> <19990731152842N.mitchell@codesourcery.com>
On Sat, Jul 31, 1999 at 03:28:42PM -0700, Mark Mitchell wrote:

> Thanks for trying the MIPS backend out.  I'm eager to shake out the
> bugs.  It seems pretty solid on IRIX6, now, but I'm sure there are
> issues remaining on other platforms.
> 
>   +  /* Assume no jalx is required  */
>   +  *require_jalxp = false;
>   +
> 
> REQUIRE_JALXP is set unconditionally a few lines down.  Why doesn't
> that do the trick?  The caller should not be looking at the value of
> require_jalx unless calculate_relocation returns a successful error
> code.

So the caller _bfd_mips_elf_relocate_section does not behave appropriately
when mips_elf_calculate_relocation returns bfd_reloc_undefined.  Search
for bfd_reloc_undefined in mips_elf_calculate_relocation; it's being
returned before an actual value gets assigned to *require_jalxp.

>   /usr/bin/mips-linux-ld: not enough GOT space for local GOT entries
> 
> Probably some relocation is requiring a local GOT entry, but we're not
> allocating it.  Look for this code in check_relocs:
> 
>       if (!h && (r_type == R_MIPS_CALL_LO16
>                || r_type == R_MIPS_GOT_LO16
>                || r_type == R_MIPS_GOT_DISP))
>       {
>         /* We may need a local GOT entry for this relocation.  We
>            don't count R_MIPS_HI16 or R_MIPS_GOT16 relocations
>            because they are always followed by a R_MIPS_LO16
>            relocation for the value.  We don't R_MIPS_GOT_PAGE
>            because we can estimate the maximum number of pages
>            needed by looking at the size of the segment.
> 
>            This estimation is very conservative since we can merge
>            duplicate entries in the GOT.  In order to be less
>            conservative, we could actually build the GOT here,
>            rather than in relocate_section.  */
>         g->local_gotno++;
>         sgot->_raw_size += MIPS_ELF_GOT_SIZE (dynobj);
>       }
> 
> Probably this code is not firing in some case where it should be
> firing.  Therefore, we're not adding enough GOT space.  That might
> help track down the bug.  
> 
> If not, feel free to send me the files on your link-line in a giant
> tar-ball, together with how your configuring binutils, and I'll try to
> duplicate and fix your problem.

I'll send you a non-giant tarball of 73kb which will demonstrate the
problem.  Just run the Makefile in the archive.  The linker has been
configured for the target mips-linux which is a standard MIPS/ELF target.

  Ralf

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