82 lines
3.2 KiB
Diff
82 lines
3.2 KiB
Diff
|
From 85ba5664eb368eb1cbd2c30b7cd574acd75edd4c Mon Sep 17 00:00:00 2001
|
||
|
From: Niklas Cassel <niklas.cassel@wdc.com>
|
||
|
Date: Mon, 4 Apr 2022 15:30:24 +0200
|
||
|
Subject: [PATCH] elf2flt.ld: reinstate 32 byte alignment for .data section
|
||
|
|
||
|
Commit 8a3e74446fe7 ("allow to build arm flat binaries") moved the
|
||
|
following commands:
|
||
|
. = ALIGN(0x20) ;
|
||
|
@SYMBOL_PREFIX@_etext = . ;
|
||
|
from the .text section to the top level in the SECTIONS node.
|
||
|
|
||
|
The .text output section is being directed to a memory region using the
|
||
|
"> flatmem :text" output section attribute. Commands in the top level in
|
||
|
the SECTIONS node are not.
|
||
|
|
||
|
This means that the ALIGN() command is no longer being appended to the
|
||
|
flatmem memory region, it will simply update the Location Counter.
|
||
|
|
||
|
The heuristic for placing an output section is described here:
|
||
|
https://sourceware.org/binutils/docs-2.38/ld.html#Output-Section-Address
|
||
|
|
||
|
"If an output memory region is set for the section then it is added to this
|
||
|
region and its address will be the next free address in that region."
|
||
|
|
||
|
Since the .data section is being directed to the same memory region as the
|
||
|
.text section, this means that the Location Counter is not used when
|
||
|
assigning an address to the .data output section, it will simply use the
|
||
|
next free address.
|
||
|
|
||
|
No longer directing these commands to the flatmem memory region means that
|
||
|
the .data output section is no longer aligned to a 32 byte boundary.
|
||
|
|
||
|
Before commit 8a3e74446fe7 ("allow to build arm flat binaries"):
|
||
|
$ readelf -S busybox_unstripped.gdb | grep data
|
||
|
[ 3] .data PROGBITS 0000000000035ac0 00036ac0
|
||
|
$ readelf -s busybox_unstripped.gdb | grep _etext
|
||
|
19286: 0000000000035ac0 0 NOTYPE GLOBAL DEFAULT 1 _etext
|
||
|
|
||
|
After commit 8a3e74446fe7 ("allow to build arm flat binaries"):
|
||
|
$ readelf -S busybox_unstripped.gdb | grep data
|
||
|
[ 3] .data PROGBITS 0000000000035ab0 00036ab0
|
||
|
$ readelf -s busybox_unstripped.gdb | grep _etext
|
||
|
19287: 0000000000035ac0 0 NOTYPE GLOBAL DEFAULT 3 _etext
|
||
|
|
||
|
The .data output section has to be aligned to a 32 byte boundary, see the
|
||
|
FLAT_DATA_ALIGN 0x20 macro and its usage in fs/binfmt_flat.c:
|
||
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs/binfmt_flat.c?h=v5.17#n59
|
||
|
|
||
|
Readd an explicit ALIGN attribute on the .data section itself, since the
|
||
|
linker will obey this attribute regardless if being directed to a memory
|
||
|
region or not. Also remove the ALIGN() command before the .data section,
|
||
|
since this misleads the reader to think that the Location Counter is used
|
||
|
when assigning an address to the .data section, when it actually is not.
|
||
|
|
||
|
Fixes: 8a3e74446fe7 ("allow to build arm flat binaries")
|
||
|
Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
|
||
|
---
|
||
|
elf2flt.ld.in | 5 +----
|
||
|
1 file changed, 1 insertion(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/elf2flt.ld.in b/elf2flt.ld.in
|
||
|
index 0df999d..e5aea14 100644
|
||
|
--- a/elf2flt.ld.in
|
||
|
+++ b/elf2flt.ld.in
|
||
|
@@ -94,12 +94,9 @@ W_RODAT: *(.gnu.linkonce.r*)
|
||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||
|
} > flatmem
|
||
|
@SYMBOL_PREFIX@__exidx_end = .;
|
||
|
-
|
||
|
- . = ALIGN(0x20) ;
|
||
|
@SYMBOL_PREFIX@_etext = . ;
|
||
|
|
||
|
- .data : {
|
||
|
- . = ALIGN(0x4) ;
|
||
|
+ .data ALIGN(0x20): {
|
||
|
@SYMBOL_PREFIX@_sdata = . ;
|
||
|
@SYMBOL_PREFIX@__data_start = . ;
|
||
|
@SYMBOL_PREFIX@data_start = . ;
|
||
|
--
|
||
|
2.35.1
|
||
|
|