linker script question

DJ Delorie dj@delorie.com
Tue Mar 27 23:51:00 GMT 2001


> 	.data : 
> 	{ 
> 		_sdata = . ;
> 		*(.data) 
> 	} > ram
> 
> 
> Can I assume, _sdata becomes a symbol and is initialized with an
> unsigned integer value of the memory location  at .data?  
> 
> Should _sdata be a symbol located at
> .data and assigned nothing?
> 
> 'ld' is apparently doing the later.  I don't think this is correct.

That's correct.  _sdata's "value" is assigned the current value of
".", or the address at which the next datum would be added.  In the
linker, the "value" of a symbol has nothing to do with the data that
happens to be stored there - the value of a symbol is an *address*
(for the most part).  The linker doesn't know about ints, structs,
arrays, or whatnot.  It only knows about addresses.  So, _sdata is a
symbol whose address is the start of the .data section.  If you did
something like this:

	extern int _sdata;

Then the *address* of _sdata would be useful.  Actually, it would be
more appropriate to do this:

	extern char _sdata[];

Then you could say that _sdata is an array of char, and the "chars"
are the contents of the .data section.



More information about the Binutils mailing list