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