Subject: Re: MIPS/ELF linker

From: Ralf Baechle <[email-masked]>
Date: Sun, 1 Aug 1999 01:22:03 +0200

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

---

From: Ralf Baechle <[email-masked]>
Date: Sun, 1 Aug 1999 01:44:11 +0200

On Sat, Jul 31, 1999 at 04:42:37PM -0700, Mark Mitchell wrote:

> Ralf --
> 
>   Thanks for the tarball.  I'll not be able to look at this until
> tomorrow, but I will do so then.

Ok, I'm looking into things in parallel if I find the time.  I'll also
try to rebuild GNU libc for MIPS.  That has historically proven to be
a bone breaker for ld.  The last time I tried a few weeks ago I got
~500 assertion messages from ld just alone for the libc final link ...
Will let you know how things go.

  Ralf