linux/arch/arm64/kernel/vmlinux.lds.S
<<
>>
Prefs
   1/*
   2 * ld script to make ARM Linux kernel
   3 * taken from the i386 version by Russell King
   4 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
   5 */
   6
   7#include <asm-generic/vmlinux.lds.h>
   8#include <asm/thread_info.h>
   9#include <asm/memory.h>
  10#include <asm/page.h>
  11
  12#define ARM_EXIT_KEEP(x)
  13#define ARM_EXIT_DISCARD(x)     x
  14
  15OUTPUT_ARCH(aarch64)
  16ENTRY(stext)
  17
  18jiffies = jiffies_64;
  19
  20#define HYPERVISOR_TEXT                                 \
  21        /*                                              \
  22         * Force the alignment to be compatible with    \
  23         * the vectors requirements                     \
  24         */                                             \
  25        . = ALIGN(2048);                                \
  26        VMLINUX_SYMBOL(__hyp_idmap_text_start) = .;     \
  27        *(.hyp.idmap.text)                              \
  28        VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;       \
  29        VMLINUX_SYMBOL(__hyp_text_start) = .;           \
  30        *(.hyp.text)                                    \
  31        VMLINUX_SYMBOL(__hyp_text_end) = .;
  32
  33SECTIONS
  34{
  35        /*
  36         * XXX: The linker does not define how output sections are
  37         * assigned to input sections when there are multiple statements
  38         * matching the same input section name.  There is no documented
  39         * order of matching.
  40         */
  41        /DISCARD/ : {
  42                ARM_EXIT_DISCARD(EXIT_TEXT)
  43                ARM_EXIT_DISCARD(EXIT_DATA)
  44                EXIT_CALL
  45                *(.discard)
  46                *(.discard.*)
  47        }
  48
  49        . = PAGE_OFFSET + TEXT_OFFSET;
  50
  51        .head.text : {
  52                _text = .;
  53                HEAD_TEXT
  54        }
  55        .text : {                       /* Real text segment            */
  56                _stext = .;             /* Text and read-only data      */
  57                        *(.smp.pen.text)
  58                        __exception_text_start = .;
  59                        *(.exception.text)
  60                        __exception_text_end = .;
  61                        IRQENTRY_TEXT
  62                        TEXT_TEXT
  63                        SCHED_TEXT
  64                        LOCK_TEXT
  65                        HYPERVISOR_TEXT
  66                        *(.fixup)
  67                        *(.gnu.warning)
  68                . = ALIGN(16);
  69                *(.got)                 /* Global offset table          */
  70        }
  71
  72        RO_DATA(PAGE_SIZE)
  73        EXCEPTION_TABLE(8)
  74        _etext = .;                     /* End of text and rodata section */
  75
  76        . = ALIGN(PAGE_SIZE);
  77        __init_begin = .;
  78
  79        INIT_TEXT_SECTION(8)
  80        .exit.text : {
  81                ARM_EXIT_KEEP(EXIT_TEXT)
  82        }
  83        . = ALIGN(16);
  84        .init.data : {
  85                INIT_DATA
  86                INIT_SETUP(16)
  87                INIT_CALLS
  88                CON_INITCALL
  89                SECURITY_INITCALL
  90                INIT_RAM_FS
  91        }
  92        .exit.data : {
  93                ARM_EXIT_KEEP(EXIT_DATA)
  94        }
  95
  96        PERCPU_SECTION(64)
  97
  98        __init_end = .;
  99        . = ALIGN(THREAD_SIZE);
 100        __data_loc = .;
 101
 102        .data : AT(__data_loc) {
 103                _data = .;              /* address in memory */
 104                _sdata = .;
 105
 106                /*
 107                 * first, the init task union, aligned
 108                 * to an 8192 byte boundary.
 109                 */
 110                INIT_TASK_DATA(THREAD_SIZE)
 111                NOSAVE_DATA
 112                CACHELINE_ALIGNED_DATA(64)
 113                READ_MOSTLY_DATA(64)
 114
 115                /*
 116                 * and the usual data section
 117                 */
 118                DATA_DATA
 119                CONSTRUCTORS
 120
 121                _edata = .;
 122        }
 123        _edata_loc = __data_loc + SIZEOF(.data);
 124
 125        NOTES
 126
 127        BSS_SECTION(0, 0, 0)
 128        _end = .;
 129
 130        STABS_DEBUG
 131        .comment 0 : { *(.comment) }
 132}
 133
 134/*
 135 * The HYP init code can't be more than a page long.
 136 */
 137ASSERT(((__hyp_idmap_text_start + PAGE_SIZE) > __hyp_idmap_text_end),
 138       "HYP init code too big")
 139