tree: drop last paragraph of GPL copyright header
[coreboot.git] / src / lib / program.ld
blob865b5f6aa73156b055076c5729ba4e4df9d01b00
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright 2015 Google Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  */
16 #include <memlayout.h>
18 /* This file is included inside a SECTIONS block */
20 /* First we place the code and read only data (typically const declared).
21  * This could theoretically be placed in rom.
22  * The '.' in '.text . : {' is actually significant to prevent missing some
23  * SoC's entry points due to artificial alignment restrictions, see
24  * https://sourceware.org/binutils/docs/ld/Output-Section-Address.html
25  */
26 .text . : {
27         _program = .;
28         _text = .;
29         /*
30          * The .rom.* sections are to acommodate x86 romstage. romcc as well
31          * as the assembly files put their text and data in these sections.
32          */
33         *(.rom.text);
34         *(.rom.data);
35         *(.text._start);
36         *(.text.stage_entry);
37         KEEP(*(.id));
38         *(.text);
39         *(.text.*);
41 #if ENV_RAMSTAGE || ENV_ROMSTAGE
42         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
43         _cbmem_init_hooks = .;
44         KEEP(*(.rodata.cbmem_init_hooks));
45         _ecbmem_init_hooks = .;
46 #endif
48 #if ENV_RAMSTAGE
49         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
50         _pci_drivers = .;
51         KEEP(*(.rodata.pci_driver));
52         _epci_drivers = .;
53         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
54         _cpu_drivers = .;
55         KEEP(*(.rodata.cpu_driver));
56         _ecpu_drivers = .;
57 #endif
59         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
60         *(.rodata);
61         *(.rodata.*);
62         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
63         _etext = .;
64 } : to_load
66 #if ENV_RAMSTAGE && IS_ENABLED(CONFIG_COVERAGE)
67 .ctors . : {
68         . = ALIGN(0x100);
69         __CTOR_LIST__ = .;
70         KEEP(*(.ctors));
71         LONG(0);
72         LONG(0);
73         __CTOR_END__ = .;
75 #endif
77 /* Include data, bss, and heap in that order. Not defined for all stages. */
78 #if ARCH_STAGE_HAS_DATA_SECTION
79 .data . : {
80         . = ALIGN(ARCH_CACHELINE_ALIGN_SIZE);
81         _data = .;
83 #if ENV_RMODULE
84         _rmodule_params = .;
85         KEEP(*(.module_parameters));
86         _ermodule_params = .;
87 #endif
89         *(.data);
90         *(.data.*);
92 #ifdef __PRE_RAM__
93         PROVIDE(_preram_cbmem_console = .);
94         PROVIDE(_epreram_cbmem_console = _preram_cbmem_console);
95 #elif ENV_RAMSTAGE
96         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
97         _bs_init_begin = .;
98         KEEP(*(.bs_init));
99         LONG(0);
100         LONG(0);
101         _ebs_init_begin = .;
102 #endif
104         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
105         _edata = .;
107 #endif
109 #if ARCH_STAGE_HAS_BSS_SECTION
110 .bss . : {
111         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
112         _bss = .;
113         *(.bss)
114         *(.bss.*)
115         *(.sbss)
116         *(.sbss.*)
117         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
118         _ebss = .;
120 #endif
122 #if ARCH_STAGE_HAS_HEAP_SECTION
123 .heap . : {
124         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
125         _heap = .;
126         . += (ENV_RMODULE ? __heap_size : CONFIG_HEAP_SIZE);
127         . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
128         _eheap = .;
130 #endif
132 _eprogram = .;
134 /* Discard the sections we don't need/want */
136 /DISCARD/ : {
137         *(.comment)
138         *(.comment.*)
139         *(.note)
140         *(.note.*)
141         *(.eh_frame);