Please suggest if there is a better way to handle this issue.

Thanks
Vivek



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. Looks like,
  ld does 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 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. Ideally I should change include/asm-generic/vmlinux.lds
  too, but I have not changed it right now as it will impact all the 
  arches and unnecessarily create 4byte sections. (Sections which shouldn't
  have been present at all.) Please suggest if there is a better way to
  handle the issue.

o This patch also move _end_rodata, symbol inside the section to force
  it to become non-absolute symbols.

Signed-off-by: Vivek Goyal <[EMAIL PROTECTED]>
---

 arch/i386/kernel/vmlinux.lds.S    |   15 +++++++++++++++
 include/asm-generic/vmlinux.lds.h |    2 +-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff -puN arch/i386/kernel/vmlinux.lds.S~i386-reloc-non-zero-size-section 
arch/i386/kernel/vmlinux.lds.S
--- 
linux-2.6.17.i386/arch/i386/kernel/vmlinux.lds.S~i386-reloc-non-zero-size-section
   2006-09-15 06:07:55.000000000 -0400
+++ linux-2.6.17.i386-root/arch/i386/kernel/vmlinux.lds.S       2006-09-15 
06:14:41.000000000 -0400
@@ -48,6 +48,7 @@ SECTIONS
        __start___ex_table = .;
        *(__ex_table)
        __stop___ex_table = .;
+       LONG(0)
   }
 
   RODATA
@@ -57,6 +58,7 @@ SECTIONS
        __tracedata_start = .;
        *(.tracedata)
        __tracedata_end = .;
+       LONG(0)
   }
 
   /* writeable */
@@ -71,6 +73,7 @@ SECTIONS
        *(.data.nosave)
        . = ALIGN(4096);
        __nosave_end = .;
+       LONG(0)
   }
 
   . = ALIGN(4096);
@@ -88,6 +91,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
@@ -96,6 +100,7 @@ SECTIONS
        __start_unwind = .;
        *(.eh_frame)
        __end_unwind = .;
+       LONG(0)
   }
 #endif
 
@@ -111,17 +116,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 */
@@ -131,6 +139,7 @@ SECTIONS
        _sinittext = .;
        *(.init.text)
        _einittext = .;
+       LONG(0)
   }
   .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
   . = ALIGN(16);
@@ -138,6 +147,7 @@ SECTIONS
        __setup_start = .;
        *(.init.setup)
        __setup_end = .;
+       LONG(0)
   }
   .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
        __initcall_start = .;
@@ -149,11 +159,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);
@@ -161,6 +173,7 @@ SECTIONS
        __alt_instructions = .;
        *(.altinstructions)
        __alt_instructions_end = .;
+       LONG(0)
   }
   .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
        *(.altinstr_replacement)
@@ -174,12 +187,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 */
diff -puN include/asm-generic/vmlinux.lds.h~i386-reloc-non-zero-size-section 
include/asm-generic/vmlinux.lds.h
--- 
linux-2.6.17.i386/include/asm-generic/vmlinux.lds.h~i386-reloc-non-zero-size-section
        2006-09-15 06:23:20.000000000 -0400
+++ linux-2.6.17.i386-root/include/asm-generic/vmlinux.lds.h    2006-09-15 
06:24:40.000000000 -0400
@@ -117,8 +117,8 @@
        /* Kernel symbol table: strings */                              \
         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {        
\
                *(__ksymtab_strings)                                    \
-       }                                                               \
        __end_rodata = .;                                               \
+       }                                                               \
        . = ALIGN(4096);                                                \
                                                                        \
        /* Built-in module parameters. */                               \
_

_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot

Reply via email to