From ad5be3cae5ebd7a21476c5a28a732ea965d556a0 Mon Sep 17 00:00:00 2001 From: TuxSH Date: Sun, 27 May 2018 00:36:41 +0200 Subject: [PATCH] =?UTF-8?q?Refactor=20exosph=C3=A8re's=20linker=20script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To properly separate text/rodata/data+bss, page-alignment needs to be added, as well as some symbol definitions and support code... --- exosphere/linker.ld | 138 ++++++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 63 deletions(-) diff --git a/exosphere/linker.ld b/exosphere/linker.ld index 5088a9bd5..43dac083a 100644 --- a/exosphere/linker.ld +++ b/exosphere/linker.ld @@ -1,9 +1,21 @@ OUTPUT_ARCH(aarch64) ENTRY(__start_cold) +PHDRS +{ + ccrt0 PT_LOAD FLAGS(7) /* Read | Write | Execute */; + pk2ldr PT_LOAD FLAGS(7) /* Read | Write | Execute */; + wcrt0 PT_LOAD FLAGS(7) /* Read | Write | Execute */; + + code PT_LOAD FLAGS(5) /* Read | Execute */; + rodata PT_LOAD FLAGS(4) /* Read */; + data PT_LOAD FLAGS(6) /* Read | Write */; + + evt PT_LOAD FLAGS(5) /* Read | Execute */; +} + MEMORY { - NULL : ORIGIN = 0, LENGTH = 4K ccrt0 : ORIGIN = 0x040006000, LENGTH = 4K glob : ORIGIN = 0x040020000, LENGTH = 128K tzram : ORIGIN = 0x07C010000, LENGTH = 64K @@ -12,19 +24,19 @@ MEMORY Normally the main code immediately follows the warmboot crt0, aligned to 256 bytes. We can't ensure or replicate that behavior properly so we'll just give 2K to the warmboot crt0. */ - warmboot_crt0 : ORIGIN = ORIGIN(tzram) + 12K, LENGTH = 2K + wcrt0 : ORIGIN = ORIGIN(tzram) + 12K, LENGTH = 2K /* 8K are the MMU L2 and L3 tables & 2K from the evt page */ - main : ORIGIN = 0x1F01E0000 + LENGTH(warmboot_crt0), LENGTH = LENGTH(tzram) - LENGTH(pk2ldr) - LENGTH(evt) - LENGTH(warmboot_crt0) - 10K - pk2ldr : ORIGIN = ORIGIN(main) - LENGTH(warmboot_crt0) + LENGTH(tzram), LENGTH = 8K + main : ORIGIN = 0x1F01E0000 + LENGTH(wcrt0), LENGTH = LENGTH(tzram) - LENGTH(pk2ldr) - LENGTH(evt) - LENGTH(wcrt0) - 10K + pk2ldr : ORIGIN = ORIGIN(main) - LENGTH(wcrt0) + LENGTH(tzram), LENGTH = 8K /* The first half of the page are exception entry stacks, the other half are the vectors themselves */ - evt : ORIGIN = ORIGIN(pk2ldr) + 40K + 2K, LENGTH = 2K + evt : ORIGIN = ORIGIN(pk2ldr) + 40K + 2K, LENGTH = 2K } SECTIONS { PROVIDE(__start__ = 0x040006000); - . = __start__; + . = ABSOLUTE(__start__); .cold_crt0 : { @@ -43,7 +55,7 @@ SECTIONS coldboot_init.o(.bss* COMMON) . = ALIGN(64); __cold_crt0_end__ = ABSOLUTE(.); - } >ccrt0 AT>glob + } >ccrt0 AT>glob :ccrt0 .pk2ldr : { @@ -53,17 +65,17 @@ SECTIONS KEEP (package2.o(.text*)) package2.o(.rodata*) package2.o(.data*) - . = ALIGN(8); - } >pk2ldr AT>glob + . = ALIGN(32); + } >pk2ldr AT>glob :pk2ldr - .pk2ldr.bss : + .pk2ldr.bss (NOLOAD) : { - . = ALIGN(8); + . = ALIGN(32); __pk2ldr_bss_start__ = ABSOLUTE(.); package2.o(.bss* COMMON) - . = ALIGN(8); + . = ALIGN(32); __pk2ldr_end__ = ABSOLUTE(.); - } >pk2ldr AT>glob + } >pk2ldr :NONE .vectors : { @@ -73,7 +85,7 @@ SECTIONS KEEP (*(.vectors*)) . = ALIGN(8); __vectors_end__ = ABSOLUTE(.); - } >evt AT>glob + } >evt AT>glob :evt .warm_crt0 : { @@ -92,7 +104,9 @@ SECTIONS warmboot_init.o(.bss*) . = ALIGN(64); __warmboot_crt0_end__ = ABSOLUTE(.); - } >warmboot_crt0 AT>glob + } >wcrt0 AT>glob :wcrt0 + + /* =========== CODE section =========== */ .text : { @@ -104,47 +118,64 @@ SECTIONS *(.text.startup .text.startup.*) *(.text.hot .text.hot.*) *(.text .stub .text.* .gnu.linkonce.t.*) - . = ALIGN(8); - } >main AT>glob + . = ALIGN(32); + } >main AT>glob :code .init : { KEEP( *(.init) ) . = ALIGN(8); - } >main AT>glob + } >main AT>glob :code .plt : { *(.plt) *(.iplt) . = ALIGN(8); - } >main AT>glob - + } >main AT>glob :code .fini : { KEEP( *(.fini) ) . = ALIGN(8); - } >main AT>glob + } >main AT>glob :code + + /* =========== RODATA section =========== */ .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) - SORT(CONSTRUCTORS) . = ALIGN(8); - } >main AT>glob + } >main AT>glob :rodata - .got : { __got_start__ = ABSOLUTE(.); *(.got) *(.igot) } >main AT>glob - .got.plt : { *(.got.plt) *(.igot.plt) __got_end__ = ABSOLUTE(.);} >main AT>glob + .eh_frame_hdr : ONLY_IF_RO { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } >main AT>glob :rodata + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } >main AT>glob :rodata + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } >main AT>glob :rodata + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } >main AT>glob :rodata + .exception_ranges : ONLY_IF_RO { *(.exception_ranges .exception_ranges*) } >main AT>glob :rodata - .preinit_array : + .note.gnu.build-id : { *(.note.gnu.build-id) } >main AT>glob :rodata + .hash : { *(.hash) } >main AT>glob :rodata + .gnu.hash : { *(.gnu.hash) } >main AT>glob :rodata + .gnu.version : { *(.gnu.version) } >main AT>glob :rodata + .gnu.version_d : { *(.gnu.version_d) } >main AT>glob :rodata + .gnu.version_r : { *(.gnu.version_r) } >main AT>glob :rodata + + /* =========== DATA section =========== */ + + .eh_frame_hdr : ONLY_IF_RW { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } >main AT>glob :data + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } >main AT>glob :data + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } >main AT>glob :data + .gnu_extab : ONLY_IF_RW { *(.gnu_extab*) } >main AT>glob :data + .exception_ranges : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } >main AT>glob :data + + .preinit_array ALIGN(8) : { - . = ALIGN(8); PROVIDE (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE (__preinit_array_end = .); . = ALIGN(8); - } >main AT>glob + } >main AT>glob :data .init_array : { @@ -152,75 +183,56 @@ SECTIONS KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) PROVIDE (__init_array_end = .); - } >main AT>glob + } >main AT>glob :data .fini_array : { - . = ALIGN(8); PROVIDE (__fini_array_start = .); KEEP (*(.fini_array)) KEEP (*(SORT(.fini_array.*))) PROVIDE (__fini_array_end = .); . = ALIGN(8); - } >main AT>glob + } >main AT>glob :data .ctors : { - . = ALIGN(8); KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) . = ALIGN(8); - } >main AT>glob + } >main AT>glob :data - .dtors ALIGN(8) : + .dtors : { - . = ALIGN(8); KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) . = ALIGN(8); - } >main AT>glob + } >main AT>glob :data - .data ALIGN(8) : + .got : { __got_start__ = ABSOLUTE(.); *(.got) *(.igot) } >main AT>glob :data + .got.plt : { *(.got.plt) *(.igot.plt) __got_end__ = ABSOLUTE(.);} >main AT>glob :data + + .data : { *(.data .data.* .gnu.linkonce.d.*) - CONSTRUCTORS - . = ALIGN(8); - } >main AT>glob + SORT(CONSTRUCTORS) + . = ALIGN(32); + } >main AT>glob :data - - .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } >main AT>glob - .eh_frame : { KEEP (*(.eh_frame)) *(.eh_frame.*) } >main AT>glob - .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) } >main AT>glob - .gnu_extab : { *(.gnu_extab*) } >main AT>glob - .exception_ranges : { *(.exception_ranges .exception_ranges*) } >main AT>glob - - .dynamic : { *(.dynamic) } >main AT>glob - .interp : { *(.interp) } >main AT>glob - .note.gnu.build-id : { *(.note.gnu.build-id) } >main AT>glob - .hash : { *(.hash) } >main AT>glob - .gnu.hash : { *(.gnu.hash) } >main AT>glob - .gnu.version : { *(.gnu.version) } >main AT>glob - .gnu.version_d : { *(.gnu.version_d) } >main AT>glob - .gnu.version_r : { *(.gnu.version_r) } >main AT>glob - .dynsym : { *(.dynsym) } >main AT>glob - .dynstr : { *(.dynstr) } >main AT>glob - .rela.dyn : { *(.rela.*); __main_end__ = ABSOLUTE(.);} >main AT>glob - - .bss : + .bss (NOLOAD) : { - . = ALIGN(8); + . = ALIGN(32); __main_bss_start__ = ABSOLUTE(.); __loaded_end_lma__ = LOADADDR(.bss); *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) - . = ALIGN(8); + . = ALIGN(32); __main_end__ = ABSOLUTE(.); - } >main AT>glob + } >main :NONE __end__ = ABSOLUTE(.) ;