summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2013-04-29 13:53:41 -0500
committerRonald G. Minnich <rminnich@gmail.com>2013-05-01 03:25:51 +0200
commite1be5ae2f485989f88ae9af92a97e0577b033155 (patch)
tree6ab9aecb21564706ede3f98ba55b0b0e08f6d1b9
parentac4b00e230a7f0dfa308d45a7b6034e96a243ab0 (diff)
rmodule: put all code/data bits in one section
While debugging a crash it was discovered that ld was inserting address space for sections that were empty depending on section address boundaries. This led to the assumption breaking down that on-disk payload (code/data bits) was contiguous with the address space. When that assumption breaks down relocation updates change the wrong memory. Fix this by making the rmodule.ld linker script put all code/data bits into a payload section. Change-Id: Ib5df7941bbd64662090136e49d15a570a1c3e041 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/3149 Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Tested-by: build bot (Jenkins)
-rw-r--r--src/lib/rmodule.ld13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/lib/rmodule.ld b/src/lib/rmodule.ld
index 41d6357fe1..96401a1715 100644
--- a/src/lib/rmodule.ld
+++ b/src/lib/rmodule.ld
@@ -35,7 +35,7 @@ SECTIONS
_module_link_start_addr = .;
_payload_begin_offset = LOADADDR(.header) + SIZEOF(.header);
- .text : AT (_payload_begin_offset) {
+ .payload : AT (_payload_begin_offset) {
/* C code of the module. */
*(.textfirst);
*(.text);
@@ -66,27 +66,26 @@ SECTIONS
*(.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);
- }
+ . = ALIGN(8);
- .data : AT (LOADADDR(.module_params) + SIZEOF(.module_params)) {
+ /* Data section. */
_sdata = .;
*(.data);
. = ALIGN(4);
_edata = .;
+
+ . = ALIGN(8);
}
/* _payload_end marks the end of the module's code and data. */
- _payload_end_offset = LOADADDR(.data) + SIZEOF(.data);
+ _payload_end_offset = LOADADDR(.payload) + SIZEOF(.payload);
.bss (NOLOAD) : {
/* C uninitialized data of the module. */