linker script symbols syntax and other errors
Klaus Rudolph
lts-rudolph@gmx.de
Sun Jul 29 18:23:00 GMT 2007
Hi,
thanks for your help, but I could get your example not to run:
if I have a linkerscript like:
----
SECTIONS
{
/* first section is .text which is used for code */
.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
:test2.ld:50: syntax error
and if not commented the line 2 gives
can you give me a hint what is going on here and what is the meaning of
a PROVIDE statement? I read the manual 2 times, but it only confuses me.
Maybe if I understand it, I will write some examples and put them into
the manual for others. Sorry that I ask again.
Klaus
> Hi Klaus,
>
>> I am now confused how I can get values from linker script to csource.
>
>
> There is an entire section in the linker manual on this topic. You
> really should read it. To save you time however, I have reproduced it
> here:
>
> Source Code Reference
>
> Accessing a linker script defined variable from source code is
> not intuitive. In particular a linker script symbol is not
> equivalent to a variable declaration in a high level language,
> it is instead a symbol that does not have a value.
>
> Before going further, it is important to note that compilers
> often transform names in the source code into different names
> when they are stored in the symbol table. For example, Fortran
> compilers commonly prepend or append an underscore, and C++
> performs extensive name mangling. Therefore there might be a
> discrepancy between the name of a variable as it is used in
> source code and the name of the same variable as it is defined
> in a linker script. For example in C a linker script variable
> might be referred to as:
>
> extern int foo;
>
> But in the linker script it might be defined as:
>
> _foo = 1000;
>
> In the remaining examples however it is assumed that no name
> transformation has taken place.
>
> When a symbol is declared in a high level language such as C,
> two things happen. The first is that the compiler reserves
> enough space in the program's memory to hold the *value* of
> the symbol. The second is that the compiler creates an entry
> in the program's symbol table which holds the symbol's *address*.
> ie the symbol table contains the address of the block of memory
> holding the symbol's value. So for example the following C
> declaration, at file scope:
>
> int foo = 1000;
>
> creates a entry called "foo" in the symbol table. This entry
> holds the address of an int sized block of memory where the
> number 1000 is initially stored.
>
> When a program references a symbol the compiler generates code
> that first accesses the symbol table to find the address of the
> symbol's memory block and then code to read the value from that
> memory block. So:
>
> foo = 1;
>
> looks up the symbol foo in the symbol table, gets the address
> associated with this symbol and then writes the value 1 into
> that address. Whereas:
>
> int * a = & foo;
>
> looks up the symbol foo in the symbol table, gets it address
> and then copies this address into the block of memory associated
> with the variable "a".
>
> Linker scripts symbol declarations, by contrast, create an entry
> in the symbol table but do not assign any memory to them. Thus
> they are an address without a value. So for example the linker
> script definition:
>
> foo = 1000;
>
> creates an entry in the symbol table called @samp{foo} which holds
> the address of memory location 1000, but nothing special is stored
> at address 1000. This means that you cannot access the *value* of
> a linker script defined symbol - it has no value - all you can do
> is use the *address* of a linker script defined symbol.
>
> Hence when you are using a linker script defined symbol in source
> code you should always take the address of the symbol, and never
> attempt to use its value. For example suppose you want to copy
> the contents of a section of memory called .ROM into a section
> called .FLASH and the linker script contains these declarations:
>
> start_of_ROM = .ROM;
> end_of_ROM = .ROM + sizeof (.ROM) - 1;
> start_of_FLASH = .FLASH;
>
> Then the C source code to perform the copy would be:
>
> extern char start_of_ROM, end_of_ROM, start_of_FLASH;
>
> memcpy (& start_of_FLASH, & start_of_ROM,
> & end_of_ROM - & start_of_ROM);
>
> Note the use of the "&" operators. They are correct.
>
>
> Cheers
> Nick
>
>
More information about the Binutils
mailing list