Linker script cleanup / consolidation
With basis in sparc64 I did a small cleanup / consolidation work. The sparc64 lds script is by no menas the worst to look at but a anyway a good place to start.
In the following patch serie I did:
-> Introduce a C-like indention style
-> Introduce use of PAGE_SIZE as replacement for hardcoded constant -> Consoildate initramfs definition
While browsing the other arch lds files I saw many other smaller items that could be consolidated but creating a define for something like 3-5 lines was to push it too much.
If there are a number of sections that could be defined together I would like to combine then in a common section but I do know too little about the linker scripts to determine this.
The other archs shall have a similar clean-up over time. sparc64 was just a good place to start because David had expressed that he liked the consolidation.
Sam
PATCH 1/5 sparc64: ident vmlinux.lds.S
This introduce a style similar to C code.
No functional changes.
--- arch/sparc64/kernel/vmlinux.lds.S | 239 ++++++++++++++++++++++--------------- 1 files changed, 142 insertions(+), 97 deletions(-)
arch/sparc64/kernel/vmlinux.lds.S +142 -97
@@ -9,105 +9,150 @@ ENTRY(_start) jiffies = jiffies_64; SECTIONS { - swapper_low_pmd_dir = 0x0000000000402000; - . = 0x4000; - .text 0x0000000000404000 : - { - _text = .; - TEXT_TEXT - SCHED_TEXT - LOCK_TEXT - KPROBES_TEXT - *(.gnu.warning) - } =0 - _etext = .; - PROVIDE (etext = .); - - RODATA - - .data : - { - DATA_DATA - CONSTRUCTORS - } - .data1 : { *(.data1) } - . = ALIGN(64); - .data.cacheline_aligned : { *(.data.cacheline_aligned) } - . = ALIGN(64); - .data.read_mostly : { *(.data.read_mostly) } - _edata = .; - PROVIDE (edata = .); - .fixup : { *(.fixup) } - - . = ALIGN(16); - __start___ex_table = .; - __ex_table : { *(__ex_table) } - __stop___ex_table = .; - - . = ALIGN(8192); - __init_begin = .; - .init.text : { - _sinittext = .; - *(.init.text) - _einittext = .; - } - .init.data : { *(.init.data) } - . = ALIGN(16); - __setup_start = .; - .init.setup : { *(.init.setup) } - __setup_end = .; - __initcall_start = .; - .initcall.init : { - INITCALLS - } - __initcall_end = .; - __con_initcall_start = .; - .con_initcall.init : { *(.con_initcall.init) } - __con_initcall_end = .; - SECURITY_INIT - . = ALIGN(4); - __tsb_ldquad_phys_patch = .; - .tsb_ldquad_phys_patch : { *(.tsb_ldquad_phys_patch) } - __tsb_ldquad_phys_patch_end = .; - __tsb_phys_patch = .; - .tsb_phys_patch : { *(.tsb_phys_patch) } - __tsb_phys_patch_end = .; - __cpuid_patch = .; - .cpuid_patch : { *(.cpuid_patch) } - __cpuid_patch_end = .; - __sun4v_1insn_patch = .; - .sun4v_1insn_patch : { *(.sun4v_1insn_patch) } - __sun4v_1insn_patch_end = .; - __sun4v_2insn_patch = .; - .sun4v_2insn_patch : { *(.sun4v_2insn_patch) } - __sun4v_2insn_patch_end = .; + swapper_low_pmd_dir = 0x0000000000402000; + . = 0x4000; + .text 0x0000000000404000 : { + _text = .; + TEXT_TEXT + SCHED_TEXT + LOCK_TEXT + KPROBES_TEXT + *(.gnu.warning) + } =0 + _etext = .; + PROVIDE (etext = .); + + RODATA + + .data : { + DATA_DATA + CONSTRUCTORS + } + .data1 : { + *(.data1) + } + + . = ALIGN(64); + .data.cacheline_aligned : { + *(.data.cacheline_aligned) + } + + . = ALIGN(64); + .data.read_mostly : { + *(.data.read_mostly) + } + _edata = .; + PROVIDE (edata = .); + .fixup : { + *(.fixup) + } + + . = ALIGN(16); + __start___ex_table = .; + __ex_table : { + *(__ex_table) + } + __stop___ex_table = .; + + . = ALIGN(8192); + __init_begin = .; + .init.text : { + _sinittext = .; + *(.init.text) + _einittext = .; + } + + .init.data : { + *(.init.data) + } + + . = ALIGN(16); + __setup_start = .; + .init.setup : { + *(.init.setup) + } + __setup_end = .; + + __initcall_start = .; + .initcall.init : { + INITCALLS + } + __initcall_end = .; + + __con_initcall_start = .; + .con_initcall.init : { + *(.con_initcall.init) + } + __con_initcall_end = .; + SECURITY_INIT + + . = ALIGN(4); + __tsb_ldquad_phys_patch = .; + .tsb_ldquad_phys_patch : { + *(.tsb_ldquad_phys_patch) + } + __tsb_ldquad_phys_patch_end = .; + + __tsb_phys_patch = .; + .tsb_phys_patch : { + *(.tsb_phys_patch) + } + __tsb_phys_patch_end = .; + + __cpuid_patch = .; + .cpuid_patch : { + *(.cpuid_patch) + } + __cpuid_patch_end = .; + + __sun4v_1insn_patch = .; + .sun4v_1insn_patch : { + *(.sun4v_1insn_patch) + } + __sun4v_1insn_patch_end = .; + __sun4v_2insn_patch = .; + .sun4v_2insn_patch : { + *(.sun4v_2insn_patch) + } + __sun4v_2insn_patch_end = .; #ifdef CONFIG_BLK_DEV_INITRD - . = ALIGN(8192); - __initramfs_start = .; - .init.ramfs : { *(.init.ramfs) } - __initramfs_end = .; + . = ALIGN(8192); + __initramfs_start = .; + .init.ramfs : { + *(.init.ramfs) + } + __initramfs_end = .; #endif - . = ALIGN(8192); - __per_cpu_start = .; - .data.percpu : { *(.data.percpu) } - __per_cpu_end = .; - . = ALIGN(8192); - __init_end = .; - __bss_start = .; - .sbss : { *(.sbss) *(.scommon) } - .bss : - { - *(.dynbss) - *(.bss) - *(COMMON) - } - _end = . ; - PROVIDE (end = .); - /DISCARD/ : { *(.exit.text) *(.exit.data) *(.exitcall.exit) } - - STABS_DEBUG - - DWARF_DEBUG + . = ALIGN(8192); + __per_cpu_start = .; + .data.percpu : { + *(.data.percpu) + } + __per_cpu_end = .; + . = ALIGN(8192); + __init_end = .; + + __bss_start = .; + .sbss : { + *(.sbss) + *(.scommon) + } + .bss : { + *(.dynbss) + *(.bss) + *(COMMON) + } + _end = . ; + PROVIDE (end = .); + + /DISCARD/ : { + *(.exit.text) + *(.exit.data) + *(.exitcall.exit) + } + + STABS_DEBUG + DWARF_DEBUG }
Signature · 1 line
1.5.1.rc3.20.gaa453
PATCH 2/5 asm-generic: add RO_DATA which take alignment parameter
In reply to Sam RavnborgRODATA has a hardcoded alignment of 4096 but architectures may which to decide their optimal alignmnet. Introduce RO_DATA that takes an alignment parameter.
--- include/asm-generic/vmlinux.lds.h | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
include/asm-generic/vmlinux.lds.h +6 -3
@@ -14,8 +14,8 @@ *(.data) \ *(.data.init.refok) -#define RODATA \ - . = ALIGN(4096); \ +#define RO_DATA (align) \ + . = ALIGN((align)); \ .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__start_rodata) = .; \ *(.rodata) *(.rodata.*) \
@@ -135,7 +135,10 @@ VMLINUX_SYMBOL(__end_rodata) = .; \ } \ \ - . = ALIGN(4096); + . = ALIGN((align)); + +/* for backward compatibility */ +#define RODATA RO_DATA(4096)#define SECURITY_INIT \ .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
Signature · 1 line
1.5.1.rc3.20.gaa453
PATCH 3/5 sparc64: use PAGE_SIZE in vmlinux.lds
In reply to Sam Ravnborgsparc64 had hardcoded pagesize to 8192 for alignment. But optimal alignment is PAGE_SIZE so replace harcoded values with the PAGE_SIZE constant.
Note: PAGE_SIZE differ with configuration so this is a change in functionality - see page.h
--- arch/sparc64/kernel/vmlinux.lds.S | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-)
arch/sparc64/kernel/vmlinux.lds.S +6 -5
@@ -1,5 +1,6 @@ /* ld script to make UltraLinux kernel */ +#include <asm/page.h> #include <asm-generic/vmlinux.lds.h> OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc")
@@ -22,7 +23,7 @@ SECTIONS _etext = .; PROVIDE (etext = .); - RODATA + RO_DATA(PAGE_SIZE) .data : { DATA_DATA
@@ -54,7 +55,7 @@ SECTIONS } __stop___ex_table = .; - . = ALIGN(8192); + . = ALIGN(PAGE_SIZE); __init_begin = .; .init.text : { _sinittext = .;
@@ -117,7 +118,7 @@ SECTIONS __sun4v_2insn_patch_end = .; #ifdef CONFIG_BLK_DEV_INITRD - . = ALIGN(8192); + . = ALIGN(PAGE_SIZE); __initramfs_start = .; .init.ramfs : { *(.init.ramfs)
@@ -125,13 +126,13 @@ SECTIONS __initramfs_end = .; #endif - . = ALIGN(8192); + . = ALIGN(PAGE_SIZE); __per_cpu_start = .; .data.percpu : { *(.data.percpu) } __per_cpu_end = .; - . = ALIGN(8192); + . = ALIGN(PAGE_SIZE); __init_end = .; __bss_start = .;
Signature · 1 line
1.5.1.rc3.20.gaa453
PATCH 4/5 asm-generic: add INITRAMFS to vmlinux.lds.h
In reply to Sam RavnborgAdd the definition of initramfs to vmlinux.lds.h
This simplifies arch lds script a bit.
---
Is these 8 lines really worth it.
I think yes - but no less than this.
Sam
include/asm-generic/vmlinux.lds.h | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
include/asm-generic/vmlinux.lds.h +13 -0
@@ -140,6 +140,19 @@/* for backward compatibility */ #define RODATA RO_DATA(4096) +/* INITRAMFS is used to hold the filesystem used during early boot. */ +#ifdef CONFIG_BLK_DEV_INITRD +#define INITRAMFS (align) \ + . = ALIGN((align)); \ + .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__initramfs_start) = .; \ + *(.init.ramfs) \ + VMLINUX_SYMBOL(__initramfs_end) = .; \ + } +#else +#define INITRAMFS (align) +#endif +#define SECURITY_INIT \ .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ VMLINUX_SYMBOL(__security_initcall_start) = .; \
Signature · 1 line
1.5.1.rc3.20.gaa453
PATCH 5/5 sparc64: use INITRAMFS in vmlinux.lds.h
In reply to Sam Ravnborg--- arch/sparc64/kernel/vmlinux.lds.S | 9 +-------- 1 files changed, 1 insertions(+), 8 deletions(-)
arch/sparc64/kernel/vmlinux.lds.S +1 -8
@@ -117,14 +117,7 @@ SECTIONS } __sun4v_2insn_patch_end = .; -#ifdef CONFIG_BLK_DEV_INITRD - . = ALIGN(PAGE_SIZE); - __initramfs_start = .; - .init.ramfs : { - *(.init.ramfs) - } - __initramfs_end = .; -#endif + INITRAMFS(PAGE_SIZE) . = ALIGN(PAGE_SIZE); __per_cpu_start = .;
Signature · 1 line
1.5.1.rc3.20.gaa453