cd9906847b
For reasons that are still unclear, the 'ncbss' region was overlapping the "audiobuffer" when linked with 2.21, but okay with 2.20. Fixed it by making the audiobuffer explcitly use the current position instead of relying on it being implicit. With this change, portalplayer-based targets generate working binaries when built with binutils 2.21 or newer. This bug also theoretically affects imx233/imx31 targets as they also have NOCACHE_BASE games in their linker scripts, but I lack access to one to test with. Change-Id: Idb38ab20f03599b9ed3d4bc0eafe519f38677438
200 lines
3.8 KiB
Text
200 lines
3.8 KiB
Text
/* Will have been included from app.lds */
|
|
ENTRY(start)
|
|
|
|
OUTPUT_FORMAT(elf32-littlearm)
|
|
OUTPUT_ARCH(arm)
|
|
STARTUP(target/arm/pp/crt0-pp.o)
|
|
|
|
#define PLUGINSIZE PLUGIN_BUFFER_SIZE
|
|
#define CODECSIZE CODEC_SIZE
|
|
|
|
#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - CODECSIZE
|
|
|
|
#define DRAMORIG 0x00000000
|
|
#define IRAMORIG 0x40000000
|
|
#define IRAMSIZE 0xc000
|
|
|
|
#ifdef CPU_PP502x
|
|
#define NOCACHE_BASE 0x10000000
|
|
#else
|
|
#define NOCACHE_BASE 0x28000000
|
|
#endif
|
|
|
|
#define CACHEALIGN_SIZE 16
|
|
|
|
/* End of the audio buffer, where the codec buffer starts */
|
|
#define ENDAUDIOADDR (DRAMORIG + DRAMSIZE)
|
|
|
|
/* Where the codec buffer ends, and the plugin buffer starts */
|
|
#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
|
|
|
|
MEMORY
|
|
{
|
|
DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
|
|
IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
|
|
}
|
|
|
|
SECTIONS
|
|
{
|
|
.text :
|
|
{
|
|
loadaddress = .;
|
|
_loadaddress = .;
|
|
. = ALIGN(0x200);
|
|
*(.init.text)
|
|
*(.text*)
|
|
*(.glue_7)
|
|
*(.glue_7t)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
.rodata :
|
|
{
|
|
*(.rodata) /* problems without this, dunno why */
|
|
*(.rodata*)
|
|
*(.rodata.str1.1)
|
|
*(.rodata.str1.4)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
.data :
|
|
{
|
|
*(.data*)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
#if NOCACHE_BASE != 0
|
|
/* .ncdata section is placed at uncached physical alias address and is
|
|
* loaded at the proper cached virtual address - no copying is
|
|
* performed in the init code */
|
|
.ncdata . + NOCACHE_BASE :
|
|
{
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
*(.ncdata*)
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
} AT> DRAM
|
|
#endif
|
|
|
|
/DISCARD/ :
|
|
{
|
|
*(.eh_frame)
|
|
}
|
|
|
|
.vectors 0x0 :
|
|
{
|
|
_vectorsstart = .;
|
|
KEEP(*(.vectors));
|
|
_vectorsend = .;
|
|
} AT> DRAM
|
|
|
|
_vectorscopy = LOADADDR(.vectors);
|
|
_noloaddram = LOADADDR(.vectors);
|
|
|
|
.ibss IRAMORIG (NOLOAD) :
|
|
{
|
|
_iedata = .;
|
|
*(.qharray)
|
|
*(.ibss*)
|
|
. = ALIGN(0x4);
|
|
_iend = .;
|
|
} > IRAM
|
|
|
|
.iram _iend :
|
|
{
|
|
_iramstart = .;
|
|
*(.icode*)
|
|
*(.irodata*)
|
|
*(.idata*)
|
|
. = ALIGN(0x4);
|
|
_iramend = .;
|
|
} > IRAM AT> DRAM
|
|
|
|
_iramcopy = LOADADDR(.iram);
|
|
|
|
|
|
.init ENDAUDIOADDR :
|
|
{
|
|
. = ALIGN(4);
|
|
_initstart = .;
|
|
*(.init*)
|
|
_initend = .;
|
|
} AT> DRAM
|
|
|
|
_initcopy = LOADADDR(.init);
|
|
|
|
.idle_stacks (NOLOAD) :
|
|
{
|
|
*(.idle_stacks)
|
|
. = ALIGN(8);
|
|
#if NUM_CORES > 1
|
|
cpu_idlestackbegin = .;
|
|
. += IDLE_STACK_SIZE;
|
|
cpu_idlestackend = .;
|
|
#endif
|
|
cop_idlestackbegin = .;
|
|
. += IDLE_STACK_SIZE;
|
|
cop_idlestackend = .;
|
|
} > IRAM
|
|
|
|
.stack (NOLOAD) :
|
|
{
|
|
*(.stack)
|
|
stackbegin = .;
|
|
. += 0x2000;
|
|
stackend = .;
|
|
} > IRAM
|
|
|
|
/* .bss and .ncbss are treated as a single section to use one init loop to
|
|
* zero it - note "_edata" and "_end" */
|
|
.bss _noloaddram (NOLOAD) :
|
|
{
|
|
_edata = .;
|
|
*(.bss*)
|
|
*(COMMON)
|
|
. = ALIGN(0x4);
|
|
} > DRAM
|
|
|
|
#if NOCACHE_BASE != 0
|
|
.ncbss . + NOCACHE_BASE (NOLOAD):
|
|
{
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
*(.ncbss*)
|
|
. = ALIGN(CACHEALIGN_SIZE);
|
|
} AT> DRAM
|
|
#endif
|
|
|
|
/* This will be aligned by preceding alignments */
|
|
.endaddr . - NOCACHE_BASE (NOLOAD) :
|
|
{
|
|
_end = .;
|
|
} > DRAM
|
|
|
|
.audiobuf _end (NOLOAD) :
|
|
{
|
|
_audiobuffer = .;
|
|
. = ALIGN(0x4);
|
|
audiobuffer = .;
|
|
} > DRAM
|
|
|
|
.audiobufend ENDAUDIOADDR (NOLOAD) :
|
|
{
|
|
#ifdef IPOD_VIDEO
|
|
audiobufend_lds = .;
|
|
#else
|
|
audiobufend = .;
|
|
#endif
|
|
_audiobufend = .;
|
|
} > DRAM
|
|
|
|
.codec ENDAUDIOADDR (NOLOAD) :
|
|
{
|
|
codecbuf = .;
|
|
_codecbuf = .;
|
|
}
|
|
|
|
.plugin ENDADDR (NOLOAD) :
|
|
{
|
|
_pluginbuf = .;
|
|
pluginbuf = .;
|
|
}
|
|
}
|