V850, linker problem

Nick Clifton nickc@redhat.com
Tue May 2 10:44:00 GMT 2006


Hi Torsten,

>   .tdata ALIGN (4) :
>   {
> 	PROVIDE (__ep = .);
> 	*(.tbyte)
> 	*(.tcommon_byte)
> 	*(.tdata)
> 	*(.tbss)
> 	*(.tcommon)
>   } >RAM AT>rom
> 
> __ep should be in RAM, but as "." is in ROM at the moment
> the error message is:
> address 0x75ec of hw2.elf section .tdata is not within region RAM
> 
> Is this assumption correct?

No.  The error message is not related to the use of ".".

Note, that the use of linker script variables can be quite unintuitive. 
  For example, in the above script fragment, the *value* of the __ep 
variable (if it is generated by the linker script and not provided by an 
object file or on the linker command line) will always be 0.  This is 
because the *value* of "." inside a section is always the offset of the 
current location from the start of the section.  Since the definition 
occurs at the start of the .tdata section's description the offset will 
be 0.  But... the *address* of the __ep symbol will be the address of 
the start of the .tdata section, in the "ram" memory region.  That is 
the address of the symbol is it's address at run-time not load-time. 
(In linker script terminology it is its VMA address not its LMA 
address).  Thus the *address* of __ep will be in RAM not ROM.

> I define some memory regions in the beginning of the linker
> script, shouldn't "ld" have one "." per memory region defined?

Yes and no.  The linker maintains a location counter for each memory 
region defined.  (Plus an extra one for sections which are not assigned 
to any particular memory region).  When an output section is assigned to 
a memory region it is inserted into the region at the location counter 
for that region, and the counter is increased.

But, when the special symbol "." is referenced inside a linker script it 
  always has a well defined value.  If it is referenced inside a 
description of a particular section then its value is the offset from 
the start of that section.  If it is referenced outside of a particular 
section description (but still inside the SECTIONS construct in the 
linker script) then its value is the absolute, run-time address that has 
been reached by the linker as it follows the script and lays out the 
sections in memory.

Cheers
   Nick



More information about the Binutils mailing list