1OUTPUT_FORMAT("elf64-littleaarch64")
2OUTPUT_ARCH(aarch64)
3ENTRY(bl1_entrypoint)
4MEMORY {
5    ROM (rx): ORIGIN = 0x00000000, LENGTH = (0x00000000 + 0x00020000) - 0x00000000
6    RAM (rwx): ORIGIN = (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x12000), LENGTH = ((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x12000)
7}
8SECTIONS
9{
10    . = 0x00000000;
11    ASSERT(. == ALIGN(((1) << (12))),
12           "BL1_RO_BASE address is not aligned on a page boundary.")
13    .text . : {
14        __TEXT_START__ = .;
15        *bl1_entrypoint.o(.text*)
16        *(SORT_BY_ALIGNMENT(.text*))
17        *(.vectors)
18        . = ALIGN(((1) << (12)));
19        __TEXT_END__ = .;
20     } >ROM
21     .ARM.extab . : {
22        *(.ARM.extab* .gnu.linkonce.armextab.*)
23     } >ROM
24     .ARM.exidx . : {
25        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
26     } >ROM
27    .rodata . : {
28        __RODATA_START__ = .;
29        *(SORT_BY_ALIGNMENT(.rodata*))
30 . = ALIGN(8); __RT_SVC_DESCS_START__ = .; KEEP(*(rt_svc_descs)) __RT_SVC_DESCS_END__ = .; . = ALIGN(8); __FCONF_POPULATOR_START__ = .; KEEP(*(.fconf_populator)) __FCONF_POPULATOR_END__ = .; . = ALIGN(8); __PMF_SVC_DESCS_START__ = .; KEEP(*(pmf_svc_descs)) __PMF_SVC_DESCS_END__ = .; . = ALIGN(8); __PARSER_LIB_DESCS_START__ = .; KEEP(*(.img_parser_lib_descs)) __PARSER_LIB_DESCS_END__ = .; . = ALIGN(8); __CPU_OPS_START__ = .; KEEP(*(cpu_ops)) __CPU_OPS_END__ = .; . = ALIGN(8); __GOT_START__ = .; *(.got) __GOT_END__ = .;
31        __RODATA_END__ = .;
32         . = ALIGN(16);
33    } >ROM
34    ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
35           "cpu_ops not defined for this platform.")
36    . = (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x12000);
37    ASSERT((((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x12000) == ALIGN(((1) << (12))),
38           "BL1_RW_BASE address is not aligned on a page boundary.")
39    .data . : ALIGN(16) { __DATA_START__ = .; *(SORT_BY_ALIGNMENT(.data*)) __DATA_END__ = .; } >RAM AT>ROM
40    __DATA_RAM_START__ = __DATA_START__;
41    __DATA_RAM_END__ = __DATA_END__;
42    stacks (NOLOAD) : { __STACKS_START__ = .; *(tzfw_normal_stacks) __STACKS_END__ = .; } >RAM
43    .bss (NOLOAD) : ALIGN(16) { __BSS_START__ = .; *(SORT_BY_ALIGNMENT(.bss*)) *(COMMON) . = ALIGN((1 << 6)); __PMF_TIMESTAMP_START__ = .; KEEP(*(pmf_timestamp_array)) . = ALIGN((1 << 6)); __PMF_PERCPU_TIMESTAMP_END__ = .; __PERCPU_TIMESTAMP_SIZE__ = ABSOLUTE(. - __PMF_TIMESTAMP_START__); . = . + (__PERCPU_TIMESTAMP_SIZE__ * (((4) + (4)) - 1)); __PMF_TIMESTAMP_END__ = .; . = ALIGN(16); *(base_xlat_table) __BSS_END__ = .; } >RAM
44    xlat_table (NOLOAD) : { *(xlat_table) } >RAM
45    coherent_ram (NOLOAD) : ALIGN(((1) << (12))) {
46        __COHERENT_RAM_START__ = .;
47        *(tzfw_coherent_mem)
48        __COHERENT_RAM_END_UNALIGNED__ = .;
49        . = ALIGN(((1) << (12)));
50        __COHERENT_RAM_END__ = .;
51    } >RAM
52    __BL1_RAM_START__ = ADDR(.data);
53    __BL1_RAM_END__ = .;
54    __DATA_ROM_START__ = LOADADDR(.data);
55    __DATA_SIZE__ = SIZEOF(.data);
56    __BL1_ROM_END__ = __DATA_ROM_START__ + __DATA_SIZE__;
57    ASSERT(__BL1_ROM_END__ <= (0x00000000 + 0x00020000),
58           "BL1's ROM content has exceeded its limit.")
59    __BSS_SIZE__ = SIZEOF(.bss);
60    __COHERENT_RAM_UNALIGNED_SIZE__ =
61        __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
62    ASSERT(. <= ((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)), "BL1's RW section has exceeded its limit.")
63}
64