linux/arch/arm/kernel/vmlinux.lds.S
<<
>>
Prefs
   1/* ld script to make ARM Linux kernel
   2 * taken from the i386 version by Russell King
   3 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
   4 */
   5
   6#include <asm-generic/vmlinux.lds.h>
   7#include <asm/thread_info.h>
   8#include <asm/memory.h>
   9#include <asm/page.h>
  10        
  11OUTPUT_ARCH(arm)
  12ENTRY(stext)
  13
  14#ifndef __ARMEB__
  15jiffies = jiffies_64;
  16#else
  17jiffies = jiffies_64 + 4;
  18#endif
  19
  20SECTIONS
  21{
  22#ifdef CONFIG_XIP_KERNEL
  23        . = XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR);
  24#else
  25        . = PAGE_OFFSET + TEXT_OFFSET;
  26#endif
  27        .text.head : {
  28                _stext = .;
  29                _sinittext = .;
  30                *(.text.head)
  31        }
  32
  33        .init : {                       /* Init code and data           */
  34                        INIT_TEXT
  35                _einittext = .;
  36                __proc_info_begin = .;
  37                        *(.proc.info.init)
  38                __proc_info_end = .;
  39                __arch_info_begin = .;
  40                        *(.arch.info.init)
  41                __arch_info_end = .;
  42                __tagtable_begin = .;
  43                        *(.taglist.init)
  44                __tagtable_end = .;
  45                . = ALIGN(16);
  46                __setup_start = .;
  47                        *(.init.setup)
  48                __setup_end = .;
  49                __early_begin = .;
  50                        *(.early_param.init)
  51                __early_end = .;
  52                __initcall_start = .;
  53                        INITCALLS
  54                __initcall_end = .;
  55                __con_initcall_start = .;
  56                        *(.con_initcall.init)
  57                __con_initcall_end = .;
  58                __security_initcall_start = .;
  59                        *(.security_initcall.init)
  60                __security_initcall_end = .;
  61#ifdef CONFIG_BLK_DEV_INITRD
  62                . = ALIGN(32);
  63                __initramfs_start = .;
  64                        usr/built-in.o(.init.ramfs)
  65                __initramfs_end = .;
  66#endif
  67                . = ALIGN(PAGE_SIZE);
  68                __per_cpu_load = .;
  69                __per_cpu_start = .;
  70                        *(.data.percpu.page_aligned)
  71                        *(.data.percpu)
  72                        *(.data.percpu.shared_aligned)
  73                __per_cpu_end = .;
  74#ifndef CONFIG_XIP_KERNEL
  75                __init_begin = _stext;
  76                INIT_DATA
  77                . = ALIGN(PAGE_SIZE);
  78                __init_end = .;
  79#endif
  80        }
  81
  82        /DISCARD/ : {                   /* Exit code and data           */
  83                EXIT_TEXT
  84                EXIT_DATA
  85                *(.exitcall.exit)
  86                *(.discard)
  87                *(.ARM.exidx.exit.text)
  88                *(.ARM.extab.exit.text)
  89#ifndef CONFIG_HOTPLUG_CPU
  90                *(.ARM.exidx.cpuexit.text)
  91                *(.ARM.extab.cpuexit.text)
  92#endif
  93#ifndef CONFIG_HOTPLUG
  94                *(.ARM.exidx.devexit.text)
  95                *(.ARM.extab.devexit.text)
  96#endif
  97#ifndef CONFIG_MMU
  98                *(.fixup)
  99                *(__ex_table)
 100#endif
 101        }
 102
 103        .text : {                       /* Real text segment            */
 104                _text = .;              /* Text and read-only data      */
 105                        __exception_text_start = .;
 106                        *(.exception.text)
 107                        __exception_text_end = .;
 108                        TEXT_TEXT
 109                        SCHED_TEXT
 110                        LOCK_TEXT
 111                        KPROBES_TEXT
 112#ifdef CONFIG_MMU
 113                        *(.fixup)
 114#endif
 115                        *(.gnu.warning)
 116                        *(.rodata)
 117                        *(.rodata.*)
 118                        *(.glue_7)
 119                        *(.glue_7t)
 120                *(.got)                 /* Global offset table          */
 121        }
 122
 123        RO_DATA(PAGE_SIZE)
 124
 125        _etext = .;                     /* End of text and rodata section */
 126
 127#ifdef CONFIG_ARM_UNWIND
 128        /*
 129         * Stack unwinding tables
 130         */
 131        . = ALIGN(8);
 132        .ARM.unwind_idx : {
 133                __start_unwind_idx = .;
 134                *(.ARM.exidx*)
 135                __stop_unwind_idx = .;
 136        }
 137        .ARM.unwind_tab : {
 138                __start_unwind_tab = .;
 139                *(.ARM.extab*)
 140                __stop_unwind_tab = .;
 141        }
 142#endif
 143
 144#ifdef CONFIG_XIP_KERNEL
 145        __data_loc = ALIGN(4);          /* location in binary */
 146        . = PAGE_OFFSET + TEXT_OFFSET;
 147#else
 148        . = ALIGN(THREAD_SIZE);
 149        __data_loc = .;
 150#endif
 151
 152        .data : AT(__data_loc) {
 153                _data = .;              /* address in memory */
 154                _sdata = .;
 155
 156                /*
 157                 * first, the init task union, aligned
 158                 * to an 8192 byte boundary.
 159                 */
 160                *(.data.init_task)
 161
 162#ifdef CONFIG_XIP_KERNEL
 163                . = ALIGN(PAGE_SIZE);
 164                __init_begin = .;
 165                INIT_DATA
 166                . = ALIGN(PAGE_SIZE);
 167                __init_end = .;
 168#endif
 169
 170                . = ALIGN(PAGE_SIZE);
 171                __nosave_begin = .;
 172                *(.data.nosave)
 173                . = ALIGN(PAGE_SIZE);
 174                __nosave_end = .;
 175
 176                /*
 177                 * then the cacheline aligned data
 178                 */
 179                . = ALIGN(32);
 180                *(.data.cacheline_aligned)
 181
 182                /*
 183                 * The exception fixup table (might need resorting at runtime)
 184                 */
 185                . = ALIGN(32);
 186                __start___ex_table = .;
 187#ifdef CONFIG_MMU
 188                *(__ex_table)
 189#endif
 190                __stop___ex_table = .;
 191
 192                /*
 193                 * and the usual data section
 194                 */
 195                DATA_DATA
 196                CONSTRUCTORS
 197
 198                _edata = .;
 199        }
 200        _edata_loc = __data_loc + SIZEOF(.data);
 201
 202#ifdef CONFIG_HAVE_TCM
 203        /*
 204         * We align everything to a page boundary so we can
 205         * free it after init has commenced and TCM contents have
 206         * been copied to its destination.
 207         */
 208        .tcm_start : {
 209                . = ALIGN(PAGE_SIZE);
 210                __tcm_start = .;
 211                __itcm_start = .;
 212        }
 213
 214        /*
 215         * Link these to the ITCM RAM
 216         * Put VMA to the TCM address and LMA to the common RAM
 217         * and we'll upload the contents from RAM to TCM and free
 218         * the used RAM after that.
 219         */
 220        .text_itcm ITCM_OFFSET : AT(__itcm_start)
 221        {
 222                __sitcm_text = .;
 223                *(.tcm.text)
 224                *(.tcm.rodata)
 225                . = ALIGN(4);
 226                __eitcm_text = .;
 227        }
 228
 229        /*
 230         * Reset the dot pointer, this is needed to create the
 231         * relative __dtcm_start below (to be used as extern in code).
 232         */
 233        . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm);
 234
 235        .dtcm_start : {
 236                __dtcm_start = .;
 237        }
 238
 239        /* TODO: add remainder of ITCM as well, that can be used for data! */
 240        .data_dtcm DTCM_OFFSET : AT(__dtcm_start)
 241        {
 242                . = ALIGN(4);
 243                __sdtcm_data = .;
 244                *(.tcm.data)
 245                . = ALIGN(4);
 246                __edtcm_data = .;
 247        }
 248
 249        /* Reset the dot pointer or the linker gets confused */
 250        . = ADDR(.dtcm_start) + SIZEOF(.data_dtcm);
 251
 252        /* End marker for freeing TCM copy in linked object */
 253        .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){
 254                . = ALIGN(PAGE_SIZE);
 255                __tcm_end = .;
 256        }
 257#endif
 258
 259        .bss : {
 260                __bss_start = .;        /* BSS                          */
 261                *(.bss)
 262                *(COMMON)
 263                __bss_stop = .;
 264                _end = .;
 265        }
 266                                        /* Stabs debugging sections.    */
 267        .stab 0 : { *(.stab) }
 268        .stabstr 0 : { *(.stabstr) }
 269        .stab.excl 0 : { *(.stab.excl) }
 270        .stab.exclstr 0 : { *(.stab.exclstr) }
 271        .stab.index 0 : { *(.stab.index) }
 272        .stab.indexstr 0 : { *(.stab.indexstr) }
 273        .comment 0 : { *(.comment) }
 274}
 275
 276/*
 277 * These must never be empty
 278 * If you have to comment these two assert statements out, your
 279 * binutils is too old (for other reasons as well)
 280 */
 281ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
 282ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
 283