[tip:x86/urgent] x86: linker script: avoid ALIGN statements inside output sections

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Commit-ID:  c707f31e2e6af2d37bc742c31be0c7e96946c71f
Gitweb:     http://git.kernel.org/tip/c707f31e2e6af2d37bc742c31be0c7e96946c71f
Author:     H. Peter Anvin <hpa@xxxxxxxxxxx>
AuthorDate: Mon, 27 Apr 2009 13:09:45 -0700
Committer:  H. Peter Anvin <hpa@xxxxxxxxxxx>
CommitDate: Mon, 27 Apr 2009 13:09:45 -0700

x86: linker script: avoid ALIGN statements inside output sections

ALIGN statements inside output sections means that the alignment
padding ends up part of the section.  This causes real problems when
the section is otherwise empty.  ALIGN can be done either before the
output section or as part of the output section header; the latter has
the advantage that the alignment information is propagated into the
appropriate ELF headers.

Without this patch, we produce invalid kernels in certain
configurations involving X86_VSMP.

Reported-and-tested-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
Signed-off-by: H. Peter Anvin <hpa@xxxxxxxxxxxxxxx>


---
 arch/x86/kernel/vmlinux_32.lds.S |   45 +++++++++++++++-----------------
 arch/x86/kernel/vmlinux_64.lds.S |   52 +++++++++++++++++--------------------
 2 files changed, 45 insertions(+), 52 deletions(-)

diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S
index 62ad500..7197db8 100644
--- a/arch/x86/kernel/vmlinux_32.lds.S
+++ b/arch/x86/kernel/vmlinux_32.lds.S
@@ -37,8 +37,7 @@ SECTIONS
   } :text = 0x9090
 
   /* read-only */
-  .text : AT(ADDR(.text) - LOAD_OFFSET) {
-	. = ALIGN(PAGE_SIZE); /* not really needed, already page aligned */
+  .text : AT(ADDR(.text) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	*(.text.page_aligned)
 	TEXT_TEXT
 	SCHED_TEXT
@@ -52,8 +51,8 @@ SECTIONS
 
   NOTES :text :note
 
-  . = ALIGN(16);		/* Exception table */
-  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
+  /* Exception table */
+  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) ALIGN(16) {
   	__start___ex_table = .;
 	 *(__ex_table)
   	__stop___ex_table = .;
@@ -62,46 +61,44 @@ SECTIONS
   RODATA
 
   /* writeable */
-  . = ALIGN(PAGE_SIZE);
-  .data : AT(ADDR(.data) - LOAD_OFFSET) {	/* Data */
+  .data : AT(ADDR(.data) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {	/* Data */
 	DATA_DATA
 	CONSTRUCTORS
 	} :data
 
-  . = ALIGN(PAGE_SIZE);
-  .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
+  .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
   	__nosave_begin = .;
 	*(.data.nosave)
   	. = ALIGN(PAGE_SIZE);
   	__nosave_end = .;
   }
 
-  . = ALIGN(PAGE_SIZE);
-  .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
+  .data.page_aligned :
+  AT(ADDR(.data.page_aligned) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	*(.data.page_aligned)
 	*(.data.idt)
   }
 
-  . = ALIGN(32);
-  .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
+  .data.cacheline_aligned :
+  AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) ALIGN(32) {
 	*(.data.cacheline_aligned)
   }
 
   /* rarely changed data like cpu maps */
-  . = ALIGN(32);
-  .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
+  .data.read_mostly :
+  AT(ADDR(.data.read_mostly) - LOAD_OFFSET) ALIGN(32) {
 	*(.data.read_mostly)
 	_edata = .;		/* End of data section */
   }
 
-  . = ALIGN(THREAD_SIZE);	/* init_task */
-  .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
+  .data.init_task :
+  AT(ADDR(.data.init_task) - LOAD_OFFSET) ALIGN(THREAD_SIZE) {
 	*(.data.init_task)
   }
 
   /* might get freed after init */
-  . = ALIGN(PAGE_SIZE);
-  .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
+  .smp_locks :
+  AT(ADDR(.smp_locks) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
   	__smp_locks = .;
 	*(.smp_locks)
 	__smp_locks_end = .;
@@ -115,8 +112,8 @@ SECTIONS
   . = ALIGN(PAGE_SIZE);
 
   /* will be freed after init */
-  . = ALIGN(PAGE_SIZE);		/* Init code and data */
-  .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
+  .init.text :
+  AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
   	__init_begin = .;
 	_sinittext = .;
 	INIT_TEXT
@@ -125,8 +122,8 @@ SECTIONS
   .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
 	INIT_DATA
   }
-  . = ALIGN(16);
-  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
+
+  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) ALIGN(16) {
   	__setup_start = .;
 	*(.init.setup)
   	__setup_end = .;
@@ -156,8 +153,8 @@ SECTIONS
   .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
 	*(.altinstr_replacement)
   }
-  . = ALIGN(4);
-  .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {
+
+  .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) ALIGN(4) {
   	__parainstructions = .;
 	*(.parainstructions)
   	__parainstructions_end = .;
diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S
index c874250..dc514b0 100644
--- a/arch/x86/kernel/vmlinux_64.lds.S
+++ b/arch/x86/kernel/vmlinux_64.lds.S
@@ -47,8 +47,8 @@ SECTIONS
 
   NOTES :text :note
 
-  . = ALIGN(16);		/* Exception table */
-  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
+  /* Exception table */
+  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) ALIGN(16) {
   	__start___ex_table = .;
 	 *(__ex_table)
   	__stop___ex_table = .;
@@ -58,20 +58,23 @@ SECTIONS
 
   . = ALIGN(PAGE_SIZE);		/* Align data segment to page size boundary */
 				/* Data */
-  .data : AT(ADDR(.data) - LOAD_OFFSET) {
+  .data :
+  AT(ADDR(.data) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	DATA_DATA
 	CONSTRUCTORS
 	_edata = .;			/* End of data section */
 	} :data
 
 
-  .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
-	. = ALIGN(PAGE_SIZE);
-	. = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
+  .data.cacheline_aligned :
+  AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	*(.data.cacheline_aligned)
   }
-  . = ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES);
-  .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
+
+  .data.read_mostly :
+  AT(ADDR(.data.read_mostly) - LOAD_OFFSET)
+  ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES)
+  {
   	*(.data.read_mostly)
   }
 
@@ -125,19 +128,19 @@ SECTIONS
 #undef VVIRT_OFFSET
 #undef VVIRT
 
-  .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
-	. = ALIGN(THREAD_SIZE);	/* init_task */
+  .data.init_task :
+  AT(ADDR(.data.init_task) - LOAD_OFFSET) ALIGN(THREAD_SIZE) {
 	*(.data.init_task)
   }:data.init
 
-  .data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
-	. = ALIGN(PAGE_SIZE);
+  .data.page_aligned :
+  AT(ADDR(.data.page_aligned) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	*(.data.page_aligned)
   }
 
-  .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
+  .smp_locks :
+  AT(ADDR(.smp_locks) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	/* might get freed after init */
-	. = ALIGN(PAGE_SIZE);
 	__smp_alt_begin = .;
 	__smp_locks = .;
 	*(.smp_locks)
@@ -159,8 +162,7 @@ SECTIONS
 	__initdata_end = .;
    }
 
-  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
-	. = ALIGN(16);
+  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) ALIGN(16) {
 	__setup_start = .;
 	*(.init.setup)
 	__setup_end = .;
@@ -182,15 +184,13 @@ SECTIONS
   }
   SECURITY_INIT
 
-  . = ALIGN(8);
-  .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {
+  .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) ALIGN(8) {
 	__parainstructions = .;
        *(.parainstructions)
 	__parainstructions_end = .;
   }
 
-  .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
-	. = ALIGN(8);
+  .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) ALIGN(8) {
 	__alt_instructions = .;
 	*(.altinstructions)
 	__alt_instructions_end = .;
@@ -208,8 +208,7 @@ SECTIONS
   }
 
 #ifdef CONFIG_BLK_DEV_INITRD
-  . = ALIGN(PAGE_SIZE);
-  .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
+  .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	__initramfs_start = .;
 	*(.init.ramfs)
 	__initramfs_end = .;
@@ -233,24 +232,21 @@ SECTIONS
   . = ALIGN(PAGE_SIZE);
   __init_end = .;
 
-  .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
-	. = ALIGN(PAGE_SIZE);
+  .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	__nosave_begin = .;
 	*(.data.nosave)
 	. = ALIGN(PAGE_SIZE);
 	__nosave_end = .;
   } :data.init2 /* use another section data.init2, see PERCPU_VADDR() above */
 
-  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
-	. = ALIGN(PAGE_SIZE);
+  .bss : AT(ADDR(.bss) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	__bss_start = .;		/* BSS */
 	*(.bss.page_aligned)
 	*(.bss)
 	__bss_stop = .;
   }
 
-  .brk : AT(ADDR(.brk) - LOAD_OFFSET) {
-	. = ALIGN(PAGE_SIZE);
+  .brk : AT(ADDR(.brk) - LOAD_OFFSET) ALIGN(PAGE_SIZE) {
 	__brk_base = . ;
  	. += 64 * 1024 ;	/* 64k alignment slop space */
 	*(.brk_reservation)	/* areas brk users have reserved */
--
To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Stable Commits]     [Linux Stable Kernel]     [Linux Kernel]     [Linux USB Devel]     [Linux Video &Media]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux