Skip to contentSkip to conversation

Linker script cleanup / consolidation

PATCH New Sam Ravnborg 1 participant 6 messages May 24, 2007 Generic include/asm header files

lore
Share & tools
lore
#0 lore raw

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

#1 lore raw

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
index fb648de..6f924fd 100644
@@ -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
#2 lore raw

PATCH 2/5 asm-generic: add RO_DATA which take alignment parameter

In reply to Sam Ravnborg

RODATA 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
index 8307b1b..5388c41 100644
@@ -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
#3 lore raw

PATCH 3/5 sparc64: use PAGE_SIZE in vmlinux.lds

In reply to Sam Ravnborg

sparc64 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
index 6f924fd..8559d07 100644
@@ -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
#4 lore raw

PATCH 4/5 asm-generic: add INITRAMFS to vmlinux.lds.h

In reply to Sam Ravnborg

Add 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
index 5388c41..0e3d2eb 100644
@@ -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
#5 lore raw

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
index 8559d07..2d6fb93 100644
@@ -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