This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Make check failure: ARM in ld-bootstrap/bootstrap.exp...


   Date: Fri, 3 Sep 1999 18:04:26 -0400
   From: Roland McGrath <roland@frob.com>

   > There is no immediately obvious linker bug here.  The error messages
   > mean that a 24 bit PC relative relocation is being used to call a
   > symbol which is more than 24 bits away.  You, or somebody, will need
   > to investigate further to see whether the relocation should success,
   > or whether the linker is using some bogus linker script which places
   > some code at a bad address, or whether the libraries should not be
   > assuming that a 24 bit PC relative relocation is always enough.

   Given the context of those messages, I suspect that the issue here is that
   those symbols (_pthread_*) are weak references that found no definition (in
   the absence of -lpthread) and so resolve to value zero.  If the load
   address is above 0x01000000 (I think it's 0x02000000 on ARM), then the PC
   in question is more than 24 bits away from zero.

   This doesn't come up in the shared library, since the relocation is of a
   32-bit element in the GOT rather than a 26-bit field in a jump instruction.

That makes sense.

   Probably you need to resort to something like this in the libc sources:

	   rettype (*volatile foo_ptr) (argtypes) = &foo;
	   (*foo_ptr) (args...);

   so that the relocation that's produced is for 32-bit immediate data.
   I don't know the ARM details to suggest in further detail.

We can simply change the ARM linker so that it does not complain about
an overflow in a PC relative relocation to an undefined weak symbol.
That's what we did for the PowerPC:

1999-06-04  Franz Sirl <Franz.Sirl-kernel@lauterbach.com>

	* elf32-ppc.c (ppc_elf_relocate_section): Don't barf on out of
	range undefweak symbols.



      else if (r == bfd_reloc_overflow)
	{
	  const char *name;

	  if (h != NULL)
	    {
	      if (h->root.type == bfd_link_hash_undefweak
		  && howto->pc_relative)
		{
		  /* Assume this is a call protected by other code that
		     detect the symbol is undefined.  If this is the case,
		     we can safely ignore the overflow.  If not, the
		     program is hosed anyway, and a little warning isn't
		     going to help.  */

		  continue;
		}

	      name = h->root.root.string;
	    }


Ian

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]