rmodules: use rmodtool to create rmodules
Start using the rmodtool for generating rmodules. rmodule_link() has been changed to create 2 rules: one for the passed in <name>, the other for creating <name>.rmod which is an ELF file in the format of an rmodule. Since the header is not compiled and linked together with an rmodule there needs to be a way of marking which symbol is the entry point. __rmodule_entry is the symbol used for knowing the entry point. There was a little churn in SMM modules to ensure an rmodule entry point symbol takes a single argument. Change-Id: Ie452ed866f6596bf13f137f5b832faa39f48d26e Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/5379 Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Tested-by: build bot (Jenkins)
This commit is contained in:
committed by
Stefan Reinauer
parent
4fde5a66b4
commit
3eb8eb7eba
@ -1,19 +1,15 @@
|
||||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
||||
OUTPUT_ARCH(i386)
|
||||
|
||||
/*
|
||||
* This linker script is used to link rmodules (relocatable modules). It
|
||||
* links at zero so that relocation fixups are easy when placing the binaries
|
||||
* anywhere in the address space.
|
||||
*
|
||||
* NOTE: The program's loadable sections (text, module_params, and data) are
|
||||
* packed into the flat blob using the AT directive. The rmodule loader assumes
|
||||
* the entire program resides in one contiguous address space. Therefore,
|
||||
* alignment for a given section (if required) needs to be done at the end of
|
||||
* the preceeding section. e.g. if the data section should be aligned to an 8
|
||||
* byte address the text section should have ALIGN(8) at the end of its section.
|
||||
* Otherwise there won't be a consistent mapping between the flat blob and the
|
||||
* loaded program.
|
||||
* packed into the flat blob. The rmodule loader assumes the entire program
|
||||
* resides in one contiguous address space. Therefore, alignment for a given
|
||||
* section (if required) needs to be done at the end of the preceeding section.
|
||||
* e.g. if the data section should be aligned to an 8 byte address the text
|
||||
* section should have ALIGN(8) at the end of its section. Otherwise there
|
||||
* won't be a consistent mapping between the flat blob and the loaded program.
|
||||
*/
|
||||
|
||||
BASE_ADDRESS = 0x00000;
|
||||
@ -22,21 +18,9 @@ SECTIONS
|
||||
{
|
||||
. = BASE_ADDRESS;
|
||||
|
||||
.header : AT (0) {
|
||||
*(.module_header);
|
||||
. = ALIGN(8);
|
||||
}
|
||||
|
||||
/* Align the start of the module program to a large enough alignment
|
||||
* so that any data in the program with an alignement property is met.
|
||||
* Essentially, this alignment is the maximum possible data alignment
|
||||
* property a program can have. */
|
||||
. = ALIGN(4096);
|
||||
_module_link_start_addr = .;
|
||||
_payload_begin_offset = LOADADDR(.header) + SIZEOF(.header);
|
||||
|
||||
.payload : AT (_payload_begin_offset) {
|
||||
.payload : {
|
||||
/* C code of the module. */
|
||||
_ram_seg = .;
|
||||
*(.textfirst);
|
||||
*(.text);
|
||||
*(.text.*);
|
||||
@ -88,9 +72,6 @@ SECTIONS
|
||||
. = ALIGN(8);
|
||||
}
|
||||
|
||||
/* _payload_end marks the end of the module's code and data. */
|
||||
_payload_end_offset = LOADADDR(.payload) + SIZEOF(.payload);
|
||||
|
||||
.bss (NOLOAD) : {
|
||||
/* C uninitialized data of the module. */
|
||||
_bss = .;
|
||||
@ -107,38 +88,11 @@ SECTIONS
|
||||
_heap = .;
|
||||
. = . + __heap_size;
|
||||
_eheap = .;
|
||||
_eram_seg = .;
|
||||
}
|
||||
|
||||
/* _module_program_size is the total memory used by the program. */
|
||||
_module_program_size = _eheap - _module_link_start_addr;
|
||||
|
||||
/* coreboot's ramstage uses the _ram_seg and _eram_seg symbols
|
||||
* for determining its load location. Provide those to help it out.
|
||||
* It's a nop for any non-ramstage rmodule. */
|
||||
_ram_seg = _module_link_start_addr;
|
||||
_eram_seg = _module_link_start_addr + _module_program_size;
|
||||
|
||||
/* The relocation information is linked on top of the BSS section
|
||||
* because the BSS section takes no space on disk. The relocation data
|
||||
* resides directly after the data section in the flat binary. */
|
||||
.relocations ADDR(.bss) : AT (_payload_end_offset) {
|
||||
*(.rel.*);
|
||||
}
|
||||
_relocations_begin_offset = LOADADDR(.relocations);
|
||||
_relocations_end_offset = _relocations_begin_offset +
|
||||
SIZEOF(.relocations);
|
||||
|
||||
/DISCARD/ : {
|
||||
/* Drop unnecessary sections. Since these modules are linked
|
||||
* as shared objects there are dynamic sections. These sections
|
||||
* aren't needed so drop them. */
|
||||
*(.comment);
|
||||
*(.note);
|
||||
*(.note.*);
|
||||
*(.dynamic);
|
||||
*(.dynsym);
|
||||
*(.dynstr);
|
||||
*(.gnu.hash);
|
||||
/* Drop unnecessary sections. */
|
||||
*(.eh_frame);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user