powerpc/nvram: Enable use Generic NVRAM driver for different size chips
[safe/jmp/linux-2.6] / arch / powerpc / kernel / vmlinux.lds.S
index 0c3000b..3bb0997 100644 (file)
@@ -9,6 +9,25 @@
 
 ENTRY(_stext)
 
+PHDRS {
+       kernel PT_LOAD FLAGS(7); /* RWX */
+       notes PT_NOTE FLAGS(0);
+       dummy PT_NOTE FLAGS(0);
+
+       /* binutils < 2.18 has a bug that makes it misbehave when taking an
+          ELF file with all segments at load address 0 as input.  This
+          happens when running "strip" on vmlinux, because of the AT() magic
+          in this linker script.  People using GCC >= 4.2 won't run into
+          this problem, because the "build-id" support will put some data
+          into the "notes" segment (at a non-zero load address).
+
+          To work around this, we force some data into both the "dummy"
+          segment and the kernel segment, so the dummy segment will get a
+          non-zero load address.  It's not enough to always create the
+          "notes" segment, since if nothing gets assigned to it, its load
+          address will be zero.  */
+}
+
 #ifdef CONFIG_PPC64
 OUTPUT_ARCH(powerpc:common64)
 jiffies = jiffies_64;
@@ -33,12 +52,14 @@ SECTIONS
        /* Text and gots */
        .text : AT(ADDR(.text) - LOAD_OFFSET) {
                ALIGN_FUNCTION();
-               *(.text.head)
+               HEAD_TEXT
                _text = .;
-               *(.text .fixup .text.init.refok .exit.text.refok)
+               /* careful! __ftr_alt_* sections need to be close to .text */
+               *(.text .fixup __ftr_alt_* .ref.text)
                SCHED_TEXT
                LOCK_TEXT
                KPROBES_TEXT
+               IRQENTRY_TEXT
 
 #ifdef CONFIG_PPC32
                *(.got1)
@@ -47,10 +68,11 @@ SECTIONS
                __got2_end = .;
 #endif /* CONFIG_PPC32 */
 
-               . = ALIGN(PAGE_SIZE);
-               _etext = .;
-               PROVIDE32 (etext = .);
-       }
+       } :kernel
+
+       . = ALIGN(PAGE_SIZE);
+       _etext = .;
+       PROVIDE32 (etext = .);
 
        /* Read-only data */
        RODATA
@@ -62,9 +84,15 @@ SECTIONS
                __stop___ex_table = .;
        }
 
-       NOTES
+       NOTES :kernel :notes
 
-       BUG_TABLE
+       /* The dummy segment contents for the bug workaround mentioned above
+          near PHDRS.  */
+       .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
+               LONG(0)
+               LONG(0)
+               LONG(0)
+       } :kernel :dummy
 
 /*
  * Init sections discarded at runtime
@@ -76,7 +104,7 @@ SECTIONS
                _sinittext = .;
                INIT_TEXT
                _einittext = .;
-       }
+       } :kernel
 
        /* .exit.text is discarded at runtime, not link time,
         * to deal with references from __bug_table
@@ -127,6 +155,18 @@ SECTIONS
                *(__ftr_fixup)
                __stop___ftr_fixup = .;
        }
+       . = ALIGN(8);
+       __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
+               __start___mmu_ftr_fixup = .;
+               *(__mmu_ftr_fixup)
+               __stop___mmu_ftr_fixup = .;
+       }
+       . = ALIGN(8);
+       __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
+               __start___lwsync_fixup = .;
+               *(__lwsync_fixup)
+               __stop___lwsync_fixup = .;
+       }
 #ifdef CONFIG_PPC64
        . = ALIGN(8);
        __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
@@ -143,13 +183,7 @@ SECTIONS
                __initramfs_end = .;
        }
 #endif
-       . = ALIGN(PAGE_SIZE);
-       .data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
-               __per_cpu_start = .;
-               *(.data.percpu)
-               *(.data.percpu.shared_aligned)
-               __per_cpu_end = .;
-       }
+       PERCPU(PAGE_SIZE)
 
        . = ALIGN(8);
        .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
@@ -157,6 +191,23 @@ SECTIONS
                *(.machine.desc)
                __machine_desc_end = . ;
        }
+#ifdef CONFIG_RELOCATABLE
+       . = ALIGN(8);
+       .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) { *(.dynsym) }
+       .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
+       .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
+       {
+               __dynamic_start = .;
+               *(.dynamic)
+       }
+       .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
+       .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
+       .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
+       {
+               __rela_dyn_start = .;
+               *(.rela*)
+       }
+#endif
 
        /* freed after init ends here */
        . = ALIGN(PAGE_SIZE);
@@ -194,10 +245,6 @@ SECTIONS
        }
 #endif
 
-       . = ALIGN(PAGE_SIZE);
-       _edata  =  .;
-       PROVIDE32 (edata = .);
-
        /* The initial task and kernel stack */
 #ifdef CONFIG_PPC32
        . = ALIGN(8192);
@@ -213,6 +260,7 @@ SECTIONS
                *(.data.page_aligned)
        }
 
+       . = ALIGN(L1_CACHE_BYTES);
        .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
                *(.data.cacheline_aligned)
        }
@@ -230,6 +278,10 @@ SECTIONS
                __nosave_end = .;
        }
 
+       . = ALIGN(PAGE_SIZE);
+       _edata  =  .;
+       PROVIDE32 (edata = .);
+
 /*
  * And finally the bss
  */