possible issue with bss section in sparc

Aleix Conchillo Flaqué aconchillo at ieec.cat
Wed Aug 29 07:46:53 UTC 2007


Hi all,

yesterday I changed some dynamic allocated arrays of structures to
static arrays and the application I am working on had a really weird
behaviour. I changed the array to dynamic and everything worked
properly again. So, after a couple of hours I started thinking that it
could be a problem of the bss section (a moment of desperation I
guess).

I had a look at the linker script
(c/src/lib/libbsp/sparc/erc32/startup/linkcmds):

  .bss :
  {
    __bss_start = ALIGN(0x8);
    _bss_start = .;
    bss_start = .;
    *(.bss)
    *(COMMON)
    end = .;
    _end = ALIGN(0x8);
    __end = ALIGN(0x8);
  } > ram

And at the startup code (c/src/lib/libbsp/sparc/shared/start.S):

        /* clear the bss */
1:

        sethi %hi(_edata),%g2
        or    %g2,%lo(_edata),%g2       ! g2 = start of bss
        sethi %hi(_end),%g3
        or    %g3,%lo(_end),%g3         ! g3 = end of bss
        mov   %g0,%g1                   ! so std has two zeros
zerobss:
        std    %g0,[%g2]
        add    %g2,8,%g2
        cmp    %g2,%g3
        bleu,a zerobss
        nop

And I thought it could be a problem on the alignment of the bss
section, which aligns to the next byte, and the instruction "std
%g0,[%g2]" which stores 8 bytes at the same time. I'm not an expert on
this, so this was another moment of desperation.

I tried out two separate things: first, change the alignment to
ALIGN(16), and second, change the assembly to (keeping ALIGN(8)):

        stb    %g0,[%g2]
        add    %g2,1,%g2

Both things worked well. So, I'm wondering if that makes any sense at
all. Could it be that the "std" is overwriting some bytes that it
should not? Should I find the error in my application, probably a
memory issue, because the bss thing doesn't make any sense?

Any clues would be really appreciated.

Thanks in advance,

Aleix



More information about the users mailing list