linux/arch/powerpc/kernel/vmlinux.lds.S
<<
>>
Prefs
   1#ifdef CONFIG_PPC64
   2#define PROVIDE32(x)    PROVIDE(__unused__##x)
   3#else
   4#define PROVIDE32(x)    PROVIDE(x)
   5#endif
   6#include <asm/page.h>
   7#include <asm-generic/vmlinux.lds.h>
   8#include <asm/cache.h>
   9#include <asm/thread_info.h>
  10
  11ENTRY(_stext)
  12
  13PHDRS {
  14        kernel PT_LOAD FLAGS(7); /* RWX */
  15        notes PT_NOTE FLAGS(0);
  16        dummy PT_NOTE FLAGS(0);
  17
  18        /* binutils < 2.18 has a bug that makes it misbehave when taking an
  19           ELF file with all segments at load address 0 as input.  This
  20           happens when running "strip" on vmlinux, because of the AT() magic
  21           in this linker script.  People using GCC >= 4.2 won't run into
  22           this problem, because the "build-id" support will put some data
  23           into the "notes" segment (at a non-zero load address).
  24
  25           To work around this, we force some data into both the "dummy"
  26           segment and the kernel segment, so the dummy segment will get a
  27           non-zero load address.  It's not enough to always create the
  28           "notes" segment, since if nothing gets assigned to it, its load
  29           address will be zero.  */
  30}
  31
  32#ifdef CONFIG_PPC64
  33OUTPUT_ARCH(powerpc:common64)
  34jiffies = jiffies_64;
  35#else
  36OUTPUT_ARCH(powerpc:common)
  37jiffies = jiffies_64 + 4;
  38#endif
  39SECTIONS
  40{
  41        . = KERNELBASE;
  42
  43/*
  44 * Text, read only data and other permanent read-only sections
  45 */
  46
  47        /* Text and gots */
  48        .text : AT(ADDR(.text) - LOAD_OFFSET) {
  49                ALIGN_FUNCTION();
  50                HEAD_TEXT
  51                _text = .;
  52                /* careful! __ftr_alt_* sections need to be close to .text */
  53                *(.text .fixup __ftr_alt_* .ref.text)
  54                SCHED_TEXT
  55                CPUIDLE_TEXT
  56                LOCK_TEXT
  57                KPROBES_TEXT
  58                IRQENTRY_TEXT
  59
  60#ifdef CONFIG_PPC32
  61                *(.got1)
  62                __got2_start = .;
  63                *(.got2)
  64                __got2_end = .;
  65#endif /* CONFIG_PPC32 */
  66
  67        } :kernel
  68
  69        . = ALIGN(PAGE_SIZE);
  70        _etext = .;
  71        PROVIDE32 (etext = .);
  72
  73        /* Read-only data */
  74        RODATA
  75
  76        EXCEPTION_TABLE(0)
  77
  78        NOTES :kernel :notes
  79
  80        /* The dummy segment contents for the bug workaround mentioned above
  81           near PHDRS.  */
  82        .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
  83                LONG(0)
  84                LONG(0)
  85                LONG(0)
  86        } :kernel :dummy
  87
  88/*
  89 * Init sections discarded at runtime
  90 */
  91        . = ALIGN(PAGE_SIZE);
  92        __init_begin = .;
  93        INIT_TEXT_SECTION(PAGE_SIZE) :kernel
  94
  95        /* .exit.text is discarded at runtime, not link time,
  96         * to deal with references from __bug_table
  97         */
  98        .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
  99                EXIT_TEXT
 100        }
 101
 102        .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
 103                INIT_DATA
 104                __vtop_table_begin = .;
 105                *(.vtop_fixup);
 106                __vtop_table_end = .;
 107                __ptov_table_begin = .;
 108                *(.ptov_fixup);
 109                __ptov_table_end = .;
 110        }
 111
 112        .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
 113                INIT_SETUP(16)
 114        }
 115
 116        .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
 117                INIT_CALLS
 118        }
 119
 120        .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
 121                CON_INITCALL
 122        }
 123
 124        SECURITY_INIT
 125
 126        . = ALIGN(8);
 127        __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
 128                __start___ftr_fixup = .;
 129                *(__ftr_fixup)
 130                __stop___ftr_fixup = .;
 131        }
 132        . = ALIGN(8);
 133        __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
 134                __start___mmu_ftr_fixup = .;
 135                *(__mmu_ftr_fixup)
 136                __stop___mmu_ftr_fixup = .;
 137        }
 138        . = ALIGN(8);
 139        __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
 140                __start___lwsync_fixup = .;
 141                *(__lwsync_fixup)
 142                __stop___lwsync_fixup = .;
 143        }
 144#ifdef CONFIG_PPC64
 145        . = ALIGN(8);
 146        __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
 147                __start___fw_ftr_fixup = .;
 148                *(__fw_ftr_fixup)
 149                __stop___fw_ftr_fixup = .;
 150        }
 151#endif
 152        .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
 153                INIT_RAM_FS
 154        }
 155
 156        PERCPU_SECTION(L1_CACHE_BYTES)
 157
 158        . = ALIGN(8);
 159        .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
 160                __machine_desc_start = . ;
 161                *(.machine.desc)
 162                __machine_desc_end = . ;
 163        }
 164#ifdef CONFIG_RELOCATABLE
 165        . = ALIGN(8);
 166        .dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET)
 167        {
 168#ifdef CONFIG_RELOCATABLE_PPC32
 169                __dynamic_symtab = .;
 170#endif
 171                *(.dynsym)
 172        }
 173        .dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
 174        .dynamic : AT(ADDR(.dynamic) - LOAD_OFFSET)
 175        {
 176                __dynamic_start = .;
 177                *(.dynamic)
 178        }
 179        .hash : AT(ADDR(.hash) - LOAD_OFFSET) { *(.hash) }
 180        .interp : AT(ADDR(.interp) - LOAD_OFFSET) { *(.interp) }
 181        .rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET)
 182        {
 183                __rela_dyn_start = .;
 184                *(.rela*)
 185        }
 186#endif
 187
 188        /* freed after init ends here */
 189        . = ALIGN(PAGE_SIZE);
 190        __init_end = .;
 191
 192/*
 193 * And now the various read/write data
 194 */
 195
 196        . = ALIGN(PAGE_SIZE);
 197        _sdata = .;
 198
 199#ifdef CONFIG_PPC32
 200        .data : AT(ADDR(.data) - LOAD_OFFSET) {
 201                DATA_DATA
 202                *(.sdata)
 203                *(.got.plt) *(.got)
 204        }
 205#else
 206        .data : AT(ADDR(.data) - LOAD_OFFSET) {
 207                DATA_DATA
 208                *(.data.rel*)
 209                *(.toc1)
 210                *(.branch_lt)
 211        }
 212
 213        .opd : AT(ADDR(.opd) - LOAD_OFFSET) {
 214                *(.opd)
 215        }
 216
 217        . = ALIGN(256);
 218        .got : AT(ADDR(.got) - LOAD_OFFSET) {
 219                __toc_start = .;
 220#ifndef CONFIG_RELOCATABLE
 221                __prom_init_toc_start = .;
 222                arch/powerpc/kernel/prom_init.o*(.toc .got)
 223                __prom_init_toc_end = .;
 224#endif
 225                *(.got)
 226                *(.toc)
 227        }
 228#endif
 229
 230        /* The initial task and kernel stack */
 231        INIT_TASK_DATA_SECTION(THREAD_SIZE)
 232
 233        .data..page_aligned : AT(ADDR(.data..page_aligned) - LOAD_OFFSET) {
 234                PAGE_ALIGNED_DATA(PAGE_SIZE)
 235        }
 236
 237        .data..cacheline_aligned : AT(ADDR(.data..cacheline_aligned) - LOAD_OFFSET) {
 238                CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
 239        }
 240
 241        .data..read_mostly : AT(ADDR(.data..read_mostly) - LOAD_OFFSET) {
 242                READ_MOSTLY_DATA(L1_CACHE_BYTES)
 243        }
 244
 245        . = ALIGN(PAGE_SIZE);
 246        .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
 247                NOSAVE_DATA
 248        }
 249
 250        . = ALIGN(PAGE_SIZE);
 251        _edata  =  .;
 252        PROVIDE32 (edata = .);
 253
 254/*
 255 * And finally the bss
 256 */
 257
 258        BSS_SECTION(0, 0, 0)
 259
 260        . = ALIGN(PAGE_SIZE);
 261        _end = . ;
 262        PROVIDE32 (end = .);
 263
 264        /* Sections to be discarded. */
 265        DISCARDS
 266}
 267