1OUTPUT_FORMAT("elf64-littleaarch64")
2OUTPUT_ARCH(aarch64)
3ENTRY(bl31_entrypoint)
4MEMORY {
5    RAM (rwx): ORIGIN = (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x20000), LENGTH = ((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x20000)
6}
7SECTIONS
8{
9    . = (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x20000);
10    ASSERT(. == ALIGN(((1) << (12))),
11           "BL31_BASE address is not aligned on a page boundary.")
12    __BL31_START__ = .;
13    .text . : {
14        __TEXT_START__ = .;
15        *bl31_entrypoint.o(.text*)
16        *(SORT_BY_ALIGNMENT(SORT(.text*)))
17        *(.vectors)
18        . = ALIGN(((1) << (12)));
19        __TEXT_END__ = .;
20    } >RAM
21    .rodata . : {
22        __RODATA_START__ = .;
23        *(SORT_BY_ALIGNMENT(.rodata*))
24 . = 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__ = .;
25        . = ALIGN(8);
26__pubsub_psci_cpu_on_finish_start = .; KEEP(*(__pubsub_psci_cpu_on_finish)); __pubsub_psci_cpu_on_finish_end = .;
27__pubsub_psci_suspend_pwrdown_start_start = .; KEEP(*(__pubsub_psci_suspend_pwrdown_start)); __pubsub_psci_suspend_pwrdown_start_end = .;
28__pubsub_psci_suspend_pwrdown_finish_start = .; KEEP(*(__pubsub_psci_suspend_pwrdown_finish)); __pubsub_psci_suspend_pwrdown_finish_end = .;
29__pubsub_cm_entering_secure_world_start = .; KEEP(*(__pubsub_cm_entering_secure_world)); __pubsub_cm_entering_secure_world_end = .;
30__pubsub_cm_exited_secure_world_start = .; KEEP(*(__pubsub_cm_exited_secure_world)); __pubsub_cm_exited_secure_world_end = .;
31__pubsub_cm_entering_normal_world_start = .; KEEP(*(__pubsub_cm_entering_normal_world)); __pubsub_cm_entering_normal_world_end = .;
32__pubsub_cm_exited_normal_world_start = .; KEEP(*(__pubsub_cm_exited_normal_world)); __pubsub_cm_exited_normal_world_end = .;
33        . = ALIGN(((1) << (12)));
34        __RODATA_END__ = .;
35    } >RAM
36    ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
37           "cpu_ops not defined for this platform.")
38    __RW_START__ = . ;
39    .data . : ALIGN(1) { __DATA_START__ = .; *(SORT_BY_ALIGNMENT(.data*)) __DATA_END__ = .; } >RAM
40    .rela.dyn : ALIGN(8) { __RELA_START__ = .; *(.rela*) __RELA_END__ = .; } >RAM
41    ASSERT(. <= (((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)) - 0x12000), "BL31 progbits has exceeded its limit.")
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        *(bakery_lock)
48        *(tzfw_coherent_mem)
49        __COHERENT_RAM_END_UNALIGNED__ = .;
50        . = ALIGN(((1) << (12)));
51        __COHERENT_RAM_END__ = .;
52    } >RAM
53    __RW_END__ = .;
54    __BL31_END__ = .;
55    /DISCARD/ : {
56        *(.dynsym .dynstr .hash .gnu.hash)
57    }
58    ASSERT(. <= ((0x0e000000 + 0x00001000) + (0x00060000 - 0x00001000)), "BL31 image has exceeded its limit.")
59}
60