Strange linker behavoir with 'heap' and 'stack' sections

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi everyone,

I am trying to find out, where my program data ends and encountered a behavoir I can not explain.

Here is what I did so far.

I set some symbols in the linker script which I am able to access in the C-source (all the symbols startXyz and endXyz).

Part of the linker script:
**************************

  .heap    :
  {
    PROVIDE( startHeap = . );
    PROVIDE (end = .);PROVIDE (__end__ = .);
    *(.heap)
    . += 0x100000;
    PROVIDE (heap_limit = . );
    PROVIDE( endHeap = . );
  } > ram_data
  .netosstack    :
  {
    PROVIDE( startNetOsStack = . );
    *(.netosstack)
    . += 0x3000;
    netosstack_end = . ;
    PROVIDE( endNetOsStack = . );
  } > ram_data
  .stack    :
  {
    PROVIDE( startStack = . );
    *(.stack)
    . += 0x2000;
    stack_end = . ;
    PROVIDE( endStack = . );
  } > ram_data
  .free_mem    :
  {
    free_mem_begin = . ;
    *(.free_mem)
    PROVIDE( endRamData = . );
  } > ram_data

The corresponding part of the map-file produced looks like that:
****************************************************************

.heap           0x00056aa0   0x100000
                0x00056aa0                PROVIDE (startHeap, .)
                0x00056aa0                PROVIDE (end, .)
                0x00056aa0                PROVIDE (__end__, .)
 *(.heap)
 *fill*         0x00056aa0   0x100000
                0x00256aa0                .=(.+0x100000)
                0x00156aa0                PROVIDE (heap_limit, .)
                0x00156aa0                PROVIDE (endHeap, .)

.netosstack     0x00156aa0     0x3000
                0x00156aa0                PROVIDE (startNetOsStack, .)
 *(.netosstack)
 *fill*         0x00156aa0     0x3000
                0x0015caa0                .=(.+0x3000)
                0x00159aa0                netosstack_end=.
                0x00159aa0                PROVIDE (endNetOsStack, .)

.stack          0x00159aa0     0x2000
                0x00159aa0                PROVIDE (startStack, .)
 *(.stack)
 *fill*         0x00159aa0     0x2000
                0x0015daa0                .=(.+0x2000)
                0x0015baa0                stack_end=.
                0x0015baa0                PROVIDE (endStack, .)

.free_mem       0x0015baa0        0x0
                0x0015baa0                free_mem_begin=.
 *(.free_mem)
                0x0015baa0                PROVIDE (endRamData, .)

In the program I checked the addresses of my symblos:
*****************************************************

address of startHeap: 0x00056aa0
address of endHeap: 0x00156aa0

address of startNetOsStack: 0x00156aa0
address of endNetOsStack: 0x00159aa0

address of startStack: 0x00159aa0
address of endStack: 0x0015baa0

address of endRamData: 0x0015baa0

address of local variable 'start' in function HardwareTest: 0x0015cc2c

sp (stack pointer): 0x0015cc24


Here are the questions: ***********************

1. What are the lines (heap, netosstack, stack)

0x00256aa0 .=(.+0x100000)

0x0015caa0 .=(.+0x3000)

0x0015daa0 .=(.+0x2000)

in the map file and why are they behind the endRamData symbol?

2. Why is the local variable 'start' located at address 0x0015cc2c and not somewhere between startStack and endStack resp. startNetOsStack and endNetOsStack?

3. Why is the stackpointer set to 0x0015cc24 which is neither netosstack nor stack?

Cheers for any help.

Roman


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux