rmodule: use program.ld for linking

Bring rmodule linking into the common linking method.
The __rmodule_entry symbol was removed while using
a more common _start symbol. The rmodtool will honor
the entry point found within the ELF header. Add
ENV_RMODULE so that one can distinguish the environment
when generating linker scripts for rmodules. Lastly,
directly use program.ld for the rmodule.ld linker script.

BUG=chrome-os-partner:44827
BRANCH=None
TEST=Built rambi and analyzed the relocatable ramstage,
     sipi_vector, and smm rmodules.

Change-Id: Iaa499eb229d8171272add9ee6d27cff75e7534ac
Signed-off-by: Aaron Durbin <adubin@chromium.org>
Reviewed-on: http://review.coreboot.org/11517
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Aaron Durbin
2015-09-05 12:59:26 -05:00
parent e5bad5cd3d
commit dde7629e9c
14 changed files with 64 additions and 125 deletions

View File

@ -12,103 +12,14 @@
* won't be a consistent mapping between the flat blob and the loaded program.
*/
BASE_ADDRESS = 0x00000;
ENTRY(__rmodule_entry);
#include <memlayout.h>
#include <arch/header.ld>
SECTIONS
{
. = BASE_ADDRESS;
SET_COUNTER(rmodule, 0x00000000)
.payload : {
/* C code of the module. */
_program = .;
*(.text._start);
*(.text.stage_entry);
*(.text);
*(.text.*);
/* C read-only data. */
. = ALIGN(16);
#if IS_ENABLED(CONFIG_COVERAGE)
__CTOR_LIST__ = .;
*(.ctors);
LONG(0);
LONG(0);
__CTOR_END__ = .;
#endif
/* The driver sections are to allow linking coreboot's
* ramstage with the rmodule linker. Any changes made in
* ramstage.ld should be made here as well. */
. = ALIGN(8);
_pci_drivers = . ;
KEEP(*(.rodata.pci_driver));
_epci_drivers = . ;
. = ALIGN(8);
_cpu_drivers = . ;
KEEP(*(.rodata.cpu_driver));
_ecpu_drivers = . ;
. = ALIGN(8);
_bs_init_begin = .;
KEEP(*(.bs_init));
LONG(0);
LONG(0);
_bs_init_end = .;
_cbmem_init_hooks = .;
KEEP(*(.rodata.cbmem_init_hooks));
_ecbmem_init_hooks = .;
. = ALIGN(8);
*(.rodata);
*(.rodata.*);
. = ALIGN(8);
/* The parameters section can be used to pass parameters
* to a module, however there has to be an prior agreement
* on how to interpret the parameters. */
_module_params_begin = .;
KEEP(*(.module_parameters));
_module_params_end = .;
. = ALIGN(8);
/* Data section. */
. = ALIGN(64); /* Mirror cache line alignment from ramstage. */
_sdata = .;
*(.data);
*(.data.*);
. = ALIGN(8);
_edata = .;
. = ALIGN(8);
}
.bss (NOLOAD) : {
/* C uninitialized data of the module. */
_bss = .;
*(.bss);
*(.bss.*)
*(.sbss)
*(.sbss.*)
*(COMMON);
. = ALIGN(8);
_ebss = .;
/*
* Place the heap after BSS. The heap size is passed in by
* by way of ld --defsym=__heap_size=<>
*/
_heap = .;
. = . + __heap_size;
_eheap = .;
_eprogram = .;
}
/DISCARD/ : {
/* Drop unnecessary sections. */
*(.eh_frame);
*(.note);
*(.note.*);
}
/* program.ld is directly included because there's no one particular
* class that rmodule is used on. */
#include <lib/program.ld>
}