bug in winarm?
Christian Klippel
ck@mamalala.net
Thu Nov 15 16:21:00 GMT 2007
hello all,
maybe this info is usefull for others, so i post it here.
it seems that the winarm toolchain is just a bit (better: a byte) different
from the linux version.
memory layout is:
MEMORY
{
ram : ORIGIN = 0x40000000, LENGTH = 64K /* free RAM area
*/
flash : ORIGIN = 0x80000000, LENGTH = 1M /* FLASH ROM
*/
}
assuming the following section in the linker script (only a part shown here):
.fastcode :
{
__fastcode_load = LOADADDR(.fastcode);
__fastcode_start = .;
/* functions with __attribute__ ((section
(".text.fastcode")))*/
*(.text.fastcode)
...
...
__fastcode_end = .;
} >ram AT>flash
and this section in the startup assembly (again, only a part shown):
/* Copy .fastcode & .data section (Copy from ROM to RAM) */
ldr R0, =__fastcode_load /*_etext*/
ldr R1, =__fastcode_start /*_data*/
...
...
the bug is that the MSB for __fastcode_load is correctly 0x80 on the linux
toolchain, but 0xC0 on the windows toolchain.
a quick workaround is to "or" the address in R0 with 0x8FFFFFFF:
ldr R0, =__fastcode_load /*_etext*/
ldr r3, entry_mask /* this and the next instruction are
an workaround */
and r0, r0, r3 /* for some ugly bug in winarm to
force msb to 0x80 */
where:
entry_mask: .word 0x8FFFFFFF
has anyone else seen this bug before? or am i missing something in the .ld?
anyway, this just shows that carefully inspecting a disassembly of the code in
question is always a good thing (tm) ... ;-D
greets,
chris
--
For unsubscribe information see http://sourceware.org/lists.html#faq
More information about the crossgcc
mailing list