Error: value of 4000000000002080 too large for field of 4 bytes

David Gibson dgibson at ozlabs.org
Tue Aug 2 13:58:54 EST 2005


On Tue, Aug 02, 2005 at 12:43:45PM +0930, Alan Modra wrote:
> On Mon, Aug 01, 2005 at 05:10:50PM +1000, David Gibson wrote:
> > gcc4 can't be the problem; that's an assembler error.  I am using:
> 
> Yes, it is an assembler bug, present in current sources and all older
> versions I checked.  PowerPC gas prior to 2005-03-02 didn't tickle the
> bug because it didn't reduce "lparMapPhys" to "xLparMap+0x400...00000"
> and from there to ".data+0x4000...02080".  So with older gas, you
> had a reloc against lparMapPhys with offset 0, and an entry in the
> symbol table, section .data, value 0x4000...02080.  With newer gas,
> you (try to) have a reloc against .data with offset 0x4000...02080.
> It's this offset that gas is complaining about, because ppc gas writes
> the value into the section contents.  Of course, since ppc uses RELA
> type relocs (addend stored separately from the section contents), the
> section contents are immaterial;  ld will overwrite them with the
> relocated value.
> 
> 	* config/tc-ppc.c (md_apply_fix <ELF>): Don't warn on overflow
> 	if emitting a reloc.

Ah!  Does this mean with the fix below, I shouldn't need the
indirection of defining lparMapPhys, and could simply do:
	.long	xLparMap - KERNELBASE

Thanks Alan, have you pushed this fix upstream yet?

> Index: gas/config/tc-ppc.c
> ===================================================================
> RCS file: /cvs/src/src/gas/config/tc-ppc.c,v
> retrieving revision 1.101
> diff -u -p -r1.101 tc-ppc.c
> --- gas/config/tc-ppc.c	5 Jul 2005 13:25:52 -0000	1.101
> +++ gas/config/tc-ppc.c	2 Aug 2005 03:06:18 -0000
> @@ -6014,6 +6014,13 @@ md_apply_fix (fixP, valP, seg)
>  
>  #ifdef OBJ_ELF
>    fixP->fx_addnumber = value;
> +
> +  /* PowerPC uses RELA relocs, ie. the reloc addend is stored separately
> +     from the section contents.  If we are going to be emitting a reloc
> +     then the section contents are immaterial, so don't warn if they
> +     happen to overflow.  Leave such warnings to ld.  */
> +  if (!fixP->fx_done)
> +    fixP->fx_no_overflow = 1;
>  #else
>    if (fixP->fx_r_type != BFD_RELOC_PPC_TOC16)
>      fixP->fx_addnumber = 0;
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/people/dgibson



More information about the Linuxppc64-dev mailing list