public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Possible Relocation Overflow ??
@ 1999-07-13  7:48 Koundinya.K
  1999-07-13  8:10 ` Mark Mitchell
  1999-07-13  8:58 ` Ian Lance Taylor
  0 siblings, 2 replies; 4+ messages in thread
From: Koundinya.K @ 1999-07-13  7:48 UTC (permalink / raw)
  To: binutils; +Cc: ian

Hi,
	At last I could compile the latest binutils (binutils-990713) !. But then 
when I try to compile hello.c I get the following error.

___________ Clip of gcc -v hello.c -o hello _____________________________

****** Earlier stuff not shown **************

/usr/cygnus/H-mips-dde-sysv4.2MP/lib/crt1.o: In function `__start':
/usr/cygnus/H-mips-dde-sysv4.2MP/lib/crt1.o(.text+0x14): relocation 
truncated to
 fit: R_MIPS_LO16 _gp_disp
collect2: ld returned 1 exit status

_____________________________________________________________________________
__

O.K Then I tried to use the startup files which my native compiler uses, and 
still got the same results.

I used the binutils binaries which I had saved, and were from the previous 
version (binutils-990702). I did not have any problems that I am having from 
the current snapshot.

Then out of curiosity I tried to generate a statically linked binary. ( 
Though I know that I have not been successful in generating one so far ), I 
got the error that

_________________ Clip of gcc -static hello.c -o hello.static __________

**** Earlier stuff not shown ***********

/usr/cygnus/H-mips-dde-sysv4.2MP/lib/crti.o: In function `_init':
/usr/cygnus/H-mips-dde-sysv4.2MP/lib/crti.o(.init+0xc): undefined reference 
to `_gp_disp'
collect2: ld returned 1 exit status

____________________________________________________________________________

And yet again I got the same result when I used the startup files which my 
native compiler uses.

Are anyone else facing these type of problems ??

Cheers !!.

Koundinya

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Possible Relocation Overflow ??
  1999-07-13  7:48 Possible Relocation Overflow ?? Koundinya.K
@ 1999-07-13  8:10 ` Mark Mitchell
  1999-07-13  8:58 ` Ian Lance Taylor
  1 sibling, 0 replies; 4+ messages in thread
From: Mark Mitchell @ 1999-07-13  8:10 UTC (permalink / raw)
  To: kk; +Cc: binutils, ian

Well, on IRIX6, there is no problem with simple hello, world programs.

But, apparently, something has been broken somewhere else.

Please tell me:

  o Exactly how you configured binutils.
  o Exactly how `ld' is being invoked (you can get this from gcc -v).
  o Tar up all files and libraries being linked, and send the file
    to file to me as a mime-attachment.

I'm sure I'll be able to fix the problem, with that information.

--
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Possible Relocation Overflow ??
  1999-07-13  7:48 Possible Relocation Overflow ?? Koundinya.K
  1999-07-13  8:10 ` Mark Mitchell
@ 1999-07-13  8:58 ` Ian Lance Taylor
  1999-07-13 15:28   ` Mark Mitchell
  1 sibling, 1 reply; 4+ messages in thread
From: Ian Lance Taylor @ 1999-07-13  8:58 UTC (permalink / raw)
  To: kk, Mark Mitchell; +Cc: binutils

   Date: Tue, 13 Jul 1999 20:25:03 +0530
   From: "Koundinya.K" <kk@ddeorg.soft.net>

   /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crt1.o: In function `__start':
   /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crt1.o(.text+0x14): relocation 
   truncated to
    fit: R_MIPS_LO16 _gp_disp

Mark, your code does overflow checking on R_MIPS_LO16 applied to
_gp_disp.  That is what the ABI recommends, but I don't see how it can
possibly work.  Code routinely uses R_MIPS_HI16 and R_MIPS_LO16 to
determine _gp_disp.  It's OK if the R_MIPS_LO16 overflows, because the
R_MIPS_HI16 is there to take care of it.

   /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crti.o: In function `_init':
   /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crti.o(.init+0xc): undefined reference 
   to `_gp_disp'

Mark, if you look back at the original code, you will see that the
test for _gp_disp is done as the start of a series of if conditions.
Testing for an undefined symbol is only done if the symbol is not
_gp_disp.  You need to replicate that, or you need to explicitly
define _gp_disp somewhere; the symbol _gp_disp is supposed to be
implicitly defined by the linker.

I think we need to go back to the original code and make sure that
every action it takes is reflected in the new code.  I don't think
writing the new code from first principles is a good idea.  There is
too much accumulated information which needs to be replicated.

Ian

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Possible Relocation Overflow ??
  1999-07-13  8:58 ` Ian Lance Taylor
@ 1999-07-13 15:28   ` Mark Mitchell
  0 siblings, 0 replies; 4+ messages in thread
From: Mark Mitchell @ 1999-07-13 15:28 UTC (permalink / raw)
  To: ian; +Cc: kk, binutils

>>>>> "Ian" == Ian Lance Taylor <ian@zembu.com> writes:

    Ian>    Date: Tue, 13 Jul 1999 20:25:03 +0530 From: "Koundinya.K"
    Ian> <kk@ddeorg.soft.net>

    Ian>    /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crt1.o: In function
    Ian> `__start':
    Ian> /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crt1.o(.text+0x14):
    Ian> relocation truncated to fit: R_MIPS_LO16 _gp_disp

    Ian> Mark, your code does overflow checking on R_MIPS_LO16 applied
    Ian> to _gp_disp.  That is what the ABI recommends, but I don't
    Ian> see how it can possibly work.  Code routinely uses
    Ian> R_MIPS_HI16 and R_MIPS_LO16 to determine _gp_disp.  It's OK
    Ian> if the R_MIPS_LO16 overflows, because the R_MIPS_HI16 is
    Ian> there to take care of it.

    Ian>    /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crti.o: In function
    Ian> `_init':
    Ian> /usr/cygnus/H-mips-dde-sysv4.2MP/lib/crti.o(.init+0xc):
    Ian> undefined reference to `_gp_disp'

    Ian> Mark, if you look back at the original code, you will see
    Ian> that the test for _gp_disp is done as the start of a series
    Ian> of if conditions.  Testing for an undefined symbol is only
    Ian> done if the symbol is not _gp_disp. 

I have attempted to restore the previous behavior with the following
patch, which I checked in.  (Of course, this still leaves the
R_MIPS16* issues to resolve.)

Also, since I didn't ever get a test-case, I didn't have a way of
making sure that this fixed the problem.

Ian, I would appreciate your inspection.

--
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

1999-07-13  Mark Mitchell  <mark@codesourcery.com>

	* elf32-mips.c (mips_elf_calculate_relocation): Do not complain
	when _gp_disp is undefined.  Do not check R_MIPS_LO16 for overflow
	when the relocation is against _gp_disp.

Index: elf32-mips.c
===================================================================
RCS file: /cvs/binutils/binutils/bfd/elf32-mips.c,v
retrieving revision 1.19
diff -u -p -r1.19 elf32-mips.c
--- elf32-mips.c	1999/07/12 17:15:34	1.19
+++ elf32-mips.c	1999/07/13 22:20:24
@@ -5770,11 +5770,13 @@ mips_elf_calculate_relocation (abfd, 
 
 	  gp_disp_p = true;
 	}
-
-      /* If this symbol is defined, calculate its address.  */
-      if ((h->root.root.type == bfd_link_hash_defined
-	   || h->root.root.type == bfd_link_hash_defweak)
-	  && h->root.root.u.def.section)
+      /* If this symbol is defined, calculate its address.  Note that
+	 _gp_disp is a magic symbol, always implicitly defined by the
+	 linker, so it's inappropriate to check to see whether or not
+	 its defined.  */
+      else if ((h->root.root.type == bfd_link_hash_defined
+		|| h->root.root.type == bfd_link_hash_defweak)
+	       && h->root.root.u.def.section)
 	{
 	  sec = h->root.root.u.def.section;
 	  if (sec->output_section)
@@ -5908,7 +5910,22 @@ mips_elf_calculate_relocation (abfd, 
       else
 	{
 	  value = addend + gp - p + 4;
-	  overflowed_p = mips_elf_overflow_p (value, 16);
+	  /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
+	     for overflow.  But, on, say, Irix 5, relocations against
+	     _gp_disp are normally generated from the .cpload
+	     pseudo-op.  It generates code that normally looks like
+	     this:
+
+	       lui    $gp,%hi(_gp_disp)
+	       addiu  $gp,$gp,%lo(_gp_disp)
+	       addu   $gp,$gp,$t9
+
+	     Here $t9 holds the address of the function being called,
+	     as required by the MIPS ELF ABI.  The R_MIPS_LO16
+	     relocation can easily overlfow in this situation, but the
+	     R_MIPS_HI16 relocation will handle the overflow.
+	     Therefore, we consider this a bug in the MIPS ABI, and do
+	     not check for overflow here.  */
 	}
       break;
 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~1999-07-13 15:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-07-13  7:48 Possible Relocation Overflow ?? Koundinya.K
1999-07-13  8:10 ` Mark Mitchell
1999-07-13  8:58 ` Ian Lance Taylor
1999-07-13 15:28   ` Mark Mitchell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).