ld - no diagnostic when the location counter moves backwards

Nick Clifton nickc@redhat.com
Tue Aug 8 13:42:00 GMT 2006


Hi Ron,

> The final assignment in foo.ld moves the location
> counter backwards (see foo.map) but I get no error
> from ld.  Making just about any change to foo.ld makes
> the error message appear (or the backward movement go
> away).  The ld manual, section 3.10.4 "The Location
> Counter" states that the location counter may never be
> moved backwards.

> Is this a bug?

Well yes and no.  Yes it is according to a strict interpretation of the 
documentation, but essentially the documentation is wrong, or rather, it 
is mis-worded.  What it should say is "The location counter should not 
be moved backwards.  If it is, and the new, lower value is used to place 
an object into the memory map, then an error will occur".

For example the linker will happily accept a backwards movement of the 
location counter if it is then followed by a forwards movement that 
moves it back to, or beyond where it used to be:

    . = . - 4 ;
    . = . + 4 ;

What is illegal is if the value of . is used to place an object into 
memory after the location counter has been moved backwards:

   . = . - 4;
   PROVIDE (foo = .) ;    /* This is OK.  */
   .foo : { LONG (0); }   /* This is NOT OK.  */
   . = . + 4;


 > We have a large program in which many different object
 > file sections are placed into various fixed size
 > memory regions and I want to be sure that the linker
 > will tell me when I overflow one of these regions.

I think that you can be sure of this.

Cheers
   Nick



More information about the Binutils mailing list