diff options
author | Aaron Durbin <adurbin@chromium.org> | 2013-04-29 13:53:41 -0500 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2013-05-01 03:25:51 +0200 |
commit | e1be5ae2f485989f88ae9af92a97e0577b033155 (patch) | |
tree | 6ab9aecb21564706ede3f98ba55b0b0e08f6d1b9 | |
parent | ac4b00e230a7f0dfa308d45a7b6034e96a243ab0 (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.ld | 13 |
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. */ |