blob: 84323ce8948f7465674f8a66f36ad60ab0d98139 [file] [log] [blame]
Aaron Durbinad935522012-12-24 14:28:37 -06001/*
2 * This linker script is used to link rmodules (relocatable modules). It
3 * links at zero so that relocation fixups are easy when placing the binaries
4 * anywhere in the address space.
5 *
6 * NOTE: The program's loadable sections (text, module_params, and data) are
Aaron Durbin3eb8eb72014-03-10 16:13:58 -05007 * packed into the flat blob. The rmodule loader assumes the entire program
8 * resides in one contiguous address space. Therefore, alignment for a given
9 * section (if required) needs to be done at the end of the preceeding section.
10 * e.g. if the data section should be aligned to an 8 byte address the text
11 * section should have ALIGN(8) at the end of its section. Otherwise there
12 * won't be a consistent mapping between the flat blob and the loaded program.
Aaron Durbinad935522012-12-24 14:28:37 -060013 */
14
15BASE_ADDRESS = 0x00000;
16
17SECTIONS
18{
19 . = BASE_ADDRESS;
20
Aaron Durbin3eb8eb72014-03-10 16:13:58 -050021 .payload : {
Aaron Durbinad935522012-12-24 14:28:37 -060022 /* C code of the module. */
Aaron Durbin3eb8eb72014-03-10 16:13:58 -050023 _ram_seg = .;
Aaron Durbind23e292e2013-03-22 19:55:35 -050024 *(.textfirst);
Aaron Durbinad935522012-12-24 14:28:37 -060025 *(.text);
26 *(.text.*);
27 /* C read-only data. */
28 . = ALIGN(16);
Aaron Durbinf7c6d482013-02-06 15:47:31 -060029
Aaron Durbind23e292e2013-03-22 19:55:35 -050030 __CTOR_LIST__ = .;
31 *(.ctors);
32 LONG(0);
33 __CTOR_END__ = .;
34
Aaron Durbinf7c6d482013-02-06 15:47:31 -060035 /* The driver sections are to allow linking coreboot's
36 * ramstage with the rmodule linker. Any changes made in
Furquan Shaikh20f25dd2014-04-22 10:41:05 -070037 * ramstage.ld should be made here as well. */
Aaron Durbinf7c6d482013-02-06 15:47:31 -060038 pci_drivers = . ;
39 *(.rodata.pci_driver)
40 epci_drivers = . ;
41 cpu_drivers = . ;
42 *(.rodata.cpu_driver)
43 ecpu_drivers = . ;
Aaron Durbina4feddf2013-04-24 16:12:52 -050044 _bs_init_begin = .;
45 *(.bs_init)
46 _bs_init_end = .;
47
Aaron Durbinf7c6d482013-02-06 15:47:31 -060048 . = ALIGN(4);
49
Aaron Durbinad935522012-12-24 14:28:37 -060050 *(.rodata);
51 *(.rodata.*);
52 . = ALIGN(4);
Aaron Durbinad935522012-12-24 14:28:37 -060053
Aaron Durbinad935522012-12-24 14:28:37 -060054 /* The parameters section can be used to pass parameters
55 * to a module, however there has to be an prior agreement
56 * on how to interpret the parameters. */
57 _module_params_begin = .;
58 *(.module_parameters);
59 _module_params_end = .;
Aaron Durbine1be5ae2013-04-29 13:53:41 -050060 . = ALIGN(8);
Aaron Durbinad935522012-12-24 14:28:37 -060061
Aaron Durbine1be5ae2013-04-29 13:53:41 -050062 /* Data section. */
Aaron Durbinad935522012-12-24 14:28:37 -060063 _sdata = .;
64 *(.data);
Aaron Durbin3bc6eb52014-03-25 14:53:28 -050065 *(.data.*);
Aaron Durbinad935522012-12-24 14:28:37 -060066 . = ALIGN(4);
67 _edata = .;
Aaron Durbine1be5ae2013-04-29 13:53:41 -050068
69 . = ALIGN(8);
Aaron Durbinad935522012-12-24 14:28:37 -060070 }
71
Aaron Durbinad935522012-12-24 14:28:37 -060072 .bss (NOLOAD) : {
Aaron Durbinf7c6d482013-02-06 15:47:31 -060073 /* C uninitialized data of the module. */
74 _bss = .;
Aaron Durbinad935522012-12-24 14:28:37 -060075 *(.bss);
Aaron Durbin3bc6eb52014-03-25 14:53:28 -050076 *(.bss.*)
77 *(.sbss)
78 *(.sbss.*)
Aaron Durbinad935522012-12-24 14:28:37 -060079 *(COMMON);
80 . = ALIGN(8);
Aaron Durbinf7c6d482013-02-06 15:47:31 -060081 _ebss = .;
Aaron Durbinad935522012-12-24 14:28:37 -060082
Aaron Durbinad935522012-12-24 14:28:37 -060083 /*
84 * Place the heap after BSS. The heap size is passed in by
85 * by way of ld --defsym=__heap_size=<>
86 */
87 _heap = .;
88 . = . + __heap_size;
89 _eheap = .;
Aaron Durbin3eb8eb72014-03-10 16:13:58 -050090 _eram_seg = .;
Aaron Durbinad935522012-12-24 14:28:37 -060091 }
92
Aaron Durbinad935522012-12-24 14:28:37 -060093 /DISCARD/ : {
Aaron Durbin3eb8eb72014-03-10 16:13:58 -050094 /* Drop unnecessary sections. */
Aaron Durbinad935522012-12-24 14:28:37 -060095 *(.eh_frame);
96 }
97}