__bss_start__ and __bss_end__ define the start and the end of the bss section respectively. That section contains uninitialized data and should be filled wth zeros when program starts.
Typical startup code for ARM platform looks like this:
// section bounds defined by linker script
extern unsigned char _text_start;
extern unsigned char _text_end;
extern unsigned char _data_start;
extern unsigned char _data_end;
extern unsigned char _bss_start;
extern unsigned char _bss_end;
extern void main(void);
extern void SystemInit(void);
void boot_entry(void)
{
register unsigned char *src, *dst;
//set up PLL
SystemInit();
// Copy data from flash to ram
src = &_text_end;
dst = &_data_start;
while(dst < &_data_end) *dst++ = *src++;
// Initialize bss
dst = &_bss_start;
while(dst < &_bss_end) *dst++ = 0;
#ifdef USE_CRT
crt_init();
__libc_init_array();
main();
//__libc_fini_array();
#else
main();
#endif
while(1);
}
Magic names like " _text_start" defined inside linker script. There's example script for LPC1114. LPC21xx differs by memory sizes and ram base address.
MEMORY
{
flash(rx): ORIGIN = 0x00000000, LENGTH = 32K
sram(rwx): ORIGIN = 0x10000000, LENGTH = 8K
}
sram_top = ORIGIN(sram) + LENGTH(sram);
ENTRY(boot_entry)
SECTIONS
{
.text :
{
_text_start = .;
/* irq vectors table */
KEEP(*(.irq_vectors))
/* static constructors */
__preinit_array_start = .;
KEEP(*(.preinit_array*))
__preinit_array_end = .;
__init_array_start = .;
KEEP(*(.init_array*))
__init_array_end = .;
/* code */
*(.text*)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.gnu*)
*(.gcc*)
/* static destructors */
/*__fini_array_start = .;
KEEP(*(.fini_array*))
__fini_array_end = .;*/
} > flash
/* exception handling */
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > flash
__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > flash
__exidx_end = .;
_text_end = .;
.data : AT (__exidx_end)
{
_data_start = .;
*(vtable)
*(.data*)
_data_end = .;
} > sram
.bss :
{
_bss_start = .;
*(.bss*)
*(COMMON)
_bss_end = .;
} > sram
end = .;
/* For GDB compatibility we decrease the top with 16 bytes */
stack_entry = sram_top - 16;
}
In that script expression "." means current address. Expression _data_start = .; defines new symbol "_data_start" and assigns current address to it.
If you neeed some other symbol names, just add them to the script