linker script symbols syntax and other errors
Nick Clifton
nickc@redhat.com
Mon Aug 6 15:47:00 GMT 2007
Hi Klaus,
> SECTIONS
> {
> .text :
> {
> ./startup.o (.text) /* Startup code */
> *(.text)
> *(.glue_7t) *(.glue_7)
> } >IntCodeRAM =0
> .ROM :
> {
> *(.linkToRam)
> }
>
> 1-> start_of_ROM = .ROM;
> 2-> /* end_of_ROM = .ROM + sizeof (.ROM) - 1;
> }
> ----
> The line 1 give a
> test2.ld:134: undefined symbol `.ROM' referenced in expression
This is correct. .ROM is not a symbol defined in the symbol table of the
executable, but rather a symbol in the SECTION directive's namespace. You can
fix this by assigning the value of "." to start_of_ROM at the start of the .ROM
section, like this:
} >IntCodeRAM =0
. = .; /* <=== NEW */
start_of_ROM = .; /* <=== NEW */
.ROM :
{
Note, for an explanation of the ". = .;" line in the above snippet see the
"Location Counter" section of the linker manual.
> :test2.ld:50: syntax error
Also correct and for the same reason. You can fix this one as well, like this:
*(linkToRam);
}
end_of_ROM = . - 1;
Assuming that you want end_of_ROM to be the address of the last byte in the
.ROM section and not the address of the first byte after the end of the .ROM
section.
> what is the meaning of
> a PROVIDE statement? I read the manual 2 times, but it only confuses me.
OK, so basically what the PROVIDE statement does is to create a symbol and
assign it a value, but only if the symbol has not appeared in any of the input
files. So for example, suppose that you have this in your linker script:
PROVIDE (foo = 1);
Then if none of the input files define a symbol called "foo", the linker will
create one and assign it the value of 1. If an input file does define a symbol
called "foo" then the linker will use that version instead and ignore the value
defined in the PROVIDE statement.
Essentially the PROVIDE statement allows the linker script to define a default
value for a symbol which can be overridden by any of the input files.
Cheers
Nick
More information about the Binutils
mailing list