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