By including the heap in the bss output section the size is accounted for in a elf PT_LOAD segment. Without this change the heap wasn't being put into a PT_LOAD segment. The result is a nop w.r.t. functionality, but readelf and company will have proper MemSiz fields. Change-Id: Ibfe9bb87603dcd4c5ff1c57c6af910bbba96b02b Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/2750 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
114 lines
3.2 KiB
Plaintext
114 lines
3.2 KiB
Plaintext
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.
|
|
*/
|
|
|
|
BASE_ADDRESS = 0x00000;
|
|
|
|
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);
|
|
|
|
.text : AT (_payload_begin_offset) {
|
|
/* C code of the module. */
|
|
*(.text);
|
|
*(.text.*);
|
|
/* C read-only data. */
|
|
. = ALIGN(16);
|
|
*(.rodata);
|
|
*(.rodata.*);
|
|
. = ALIGN(4);
|
|
}
|
|
|
|
.module_params : AT (LOADADDR(.text) + SIZEOF(.text)) {
|
|
/* 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 = .;
|
|
*(.module_parameters);
|
|
_module_params_end = .;
|
|
. = ALIGN(4);
|
|
}
|
|
|
|
.data : AT (LOADADDR(.module_params) + SIZEOF(.module_params)) {
|
|
_sdata = .;
|
|
*(.data);
|
|
. = ALIGN(4);
|
|
_edata = .;
|
|
}
|
|
|
|
/* _payload_end marks the end of the module's code and data. */
|
|
_payload_end_offset = LOADADDR(.data) + SIZEOF(.data);
|
|
|
|
.bss (NOLOAD) : {
|
|
/* C uninitialized data of the SMM handler */
|
|
_bss_begin = .;
|
|
*(.bss);
|
|
*(.sbss);
|
|
*(COMMON);
|
|
. = ALIGN(8);
|
|
_bss_end = .;
|
|
|
|
/*
|
|
* Place the heap after BSS. The heap size is passed in by
|
|
* by way of ld --defsym=__heap_size=<>
|
|
*/
|
|
_heap = .;
|
|
. = . + __heap_size;
|
|
_eheap = .;
|
|
}
|
|
|
|
/* _module_program_size is the total memory used by the program. */
|
|
_module_program_size = _eheap - _module_link_start_addr;
|
|
|
|
/* 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);
|
|
*(.eh_frame);
|
|
}
|
|
}
|