Thanks for your answer.
I think I know the problem (and know how to work around it by avoiding the AT clause in the locator control file).
I guess there is a mess (WRT v4->v5->v6) in regarding how locator labels get their address in sections which have different p_addr and v_addr. I got the impression (but I had to re-verify it) that even the meaning of physical address and virtual address was interchanged on the course of v4->v5->v6 - this makes it even more confusing.
The problem is quite general:
Locator labels do not seem to have a 'storage qualifier' which assigns to them either the physical address or the virtual address.
With my Linker v6.3
- physical address is, where the objects are stored in memory (ROM),
- virtual address is the location, where they will be accessed from (after copying in the initialization, RAM).
Labels within sections with virtual memory get the virtual memory address assigned:
.appcode :
{
*(.text);
* (rodata);
endofappcode = .; // v_addr == p_addr, since no AT()
} > MYROM
ANCHOR = endofappcode;
.inidata : AT(0x10000) // virtual memory at 0x10000
{
vLABEL = .; v_addr != p_addr, vLABLE points to v_addr
*(.data);
*(.sdata);
} >> MYROM // physical memory
OFFSET = sizeof(.inidata);
# I am now avoiding AT() to obtain a label with a physical address:
.romp :
{
. = . + ANCHOR + OFFSET; // manually advance the p_addr location pointer !?!?
_S_romp = .; // p_addr, since v_addr == p_addr
WRITE(...);
...
} >> MYROM // physical memory
If I have more time in a few days, I will revise it with 6.4 and send a problem report.
Thanks and regards,
Frank