The patch titled i386: Force section size to be non-zero to prevent a symbol becoming absolute has been added to the -mm tree. Its filename is i386-force-section-size-to-be-non-zero-to-prevent-a-symbol-becoming-absolute.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: i386: Force section size to be non-zero to prevent a symbol becoming absolute From: Vivek Goyal <vgoyal@xxxxxxxxxx> o Relocation patches for i386, moved the symbols in vmlinux.lds.S inside sections so that these symbols become section relative and are no more absolute. If these symbols become absolute, its bad as they are not relocated if kernel is not loaded at the address it has been compiled for. o Ironically, just moving the symbols inside the section does not gurantee that symbols inside will not become absolute. Recent versions of linkers, do some optimization, and if section size is zero, it gets rid of the section and makes any defined symbol as absolute. o This leads to a failure while second kernel is booting. arch/i386/alternative.c frees any pages present between __smp_alt_begin and __smp_alt_end. In my case size of section .smp_altinstructions is zero and symbol __smpt_alt_begin becomes absolute and is not relocated and system crashes while it is trying to free the memory starting from __smp_alt_begin. o This issue is being fixed by the linker guys and they are making sure that linker does not get rid of an empty section if there is any section relative symbol defined in it. But we need to fix it at kernel level too so that people using the linker version without fix, are not affected. o One of the possible solutions is that force the section size to be non zero to make sure these symbols don't become absolute. This patch implements that. Signed-off-by: Vivek Goyal <vgoyal@xxxxxxxxxx> Cc: Andi Kleen <ak@xxxxxx> Cc: "H. J. Lu" <hjl@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/i386/kernel/vmlinux.lds.S | 15 +++++++++++++++ 1 files changed, 15 insertions(+) diff -puN arch/i386/kernel/vmlinux.lds.S~i386-force-section-size-to-be-non-zero-to-prevent-a-symbol-becoming-absolute arch/i386/kernel/vmlinux.lds.S --- a/arch/i386/kernel/vmlinux.lds.S~i386-force-section-size-to-be-non-zero-to-prevent-a-symbol-becoming-absolute +++ a/arch/i386/kernel/vmlinux.lds.S @@ -42,6 +42,7 @@ SECTIONS __start___ex_table = .; *(__ex_table) __stop___ex_table = .; + LONG(0) } _sdata = .; /* End of text section */ @@ -53,6 +54,7 @@ SECTIONS __tracedata_start = .; *(.tracedata) __tracedata_end = .; + LONG(0) } /* writeable */ @@ -68,6 +70,7 @@ SECTIONS *(.data.nosave) . = ALIGN(4096); __nosave_end = .; + LONG(0) } . = ALIGN(4096); @@ -85,6 +88,7 @@ SECTIONS .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) _edata = .; /* End of data section */ + LONG(0) } #ifdef CONFIG_STACK_UNWIND @@ -93,6 +97,7 @@ SECTIONS __start_unwind = .; *(.eh_frame) __end_unwind = .; + LONG(0) } #endif @@ -108,17 +113,20 @@ SECTIONS __smp_alt_instructions = .; *(.smp_altinstructions) __smp_alt_instructions_end = .; + LONG(0) } . = ALIGN(4); .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { __smp_locks = .; *(.smp_locks) __smp_locks_end = .; + LONG(0) } .smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) { *(.smp_altinstr_replacement) . = ALIGN(4096); __smp_alt_end = .; + LONG(0) } /* will be freed after init */ @@ -128,6 +136,7 @@ SECTIONS _sinittext = .; *(.init.text) _einittext = .; + LONG(0) } .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } . = ALIGN(16); @@ -135,6 +144,7 @@ SECTIONS __setup_start = .; *(.init.setup) __setup_end = .; + LONG(0) } .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { __initcall_start = .; @@ -146,11 +156,13 @@ SECTIONS *(.initcall6.init) *(.initcall7.init) __initcall_end = .; + LONG(0) } .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) { __con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .; + LONG(0) } SECURITY_INIT . = ALIGN(4); @@ -158,6 +170,7 @@ SECTIONS __alt_instructions = .; *(.altinstructions) __alt_instructions_end = .; + LONG(0) } .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { *(.altinstr_replacement) @@ -171,12 +184,14 @@ SECTIONS __initramfs_start = .; *(.init.ramfs) __initramfs_end = .; + LONG(0) } . = ALIGN(L1_CACHE_BYTES); .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { __per_cpu_start = .; *(.data.percpu) __per_cpu_end = .; + LONG(0) } . = ALIGN(4096); /* freed after init ends here */ _ Patches currently in -mm which might be from vgoyal@xxxxxxxxxx are origin.patch i386-distinguish-absolute-symbols.patch i386-align-data-section-to-4k-boundary.patch i386-force-section-size-to-be-non-zero-to-prevent-a-symbol-becoming-absolute.patch i386-define-__pa_symbol.patch i386-setupc-reserve-kernel-memory-starting-from-_text.patch i386-config_physical_start-cleanup.patch make-linux-elfh-safe-to-be-included-in-assembly-files.patch elf-add-elfosabi_standalone-to-elfh.patch kallsyms-generate-relocatable-symbols.patch i386-relocatable-kernel-support.patch i386-implement-config_physical_align.patch i386-boot-add-an-elf-header-to-bzimage.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html