+ i386-force-section-size-to-be-non-zero-to-prevent-a-symbol-becoming-absolute.patch added to -mm tree

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

 



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

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux