[PATCH v2] arm: Add OVERLAY command to BSS section on ARM64
Ilias Apalodimas
ilias.apalodimas at linaro.org
Tue Feb 6 17:35:37 CET 2024
On Tue, 6 Feb 2024 at 16:44, Ilias Apalodimas
<ilias.apalodimas at linaro.org> wrote:
>
> Hi Marek,
>
> On Sun, Dec 17, 2023 at 01:33:39AM +0100, Marek Vasut wrote:
> > Avoid allocating and loading the BSS section.
> >
>
> Can we elaborate a bit more on why we need this? AFAICT there's no code
> loading those segments in memory and swapping them, so why do we need the
> OVERLAY? On top of that the ALLOC flag seems to be missing? The .bss
> section doesn't need to be loaded indeed, since we can memset it to 0, but
> it does need proper backing memory.
>
> another thing I noticed is the bss_start and end are defined as sections of
> their own and a bit of git history led me to 3ebd1cbc49f00050. But the
> linker script will emit absolute addresses only if the symbol is defined
> outside a section. IOW applying this makes the value expressed as a fixed
> offset from the base of the section and the bss_start/end sections go away
>
> --- a/arch/arm/cpu/armv8/u-boot.lds
> +++ b/arch/arm/cpu/armv8/u-boot.lds
> @@ -151,17 +151,11 @@ SECTIONS
>
> . = ALIGN(8);
>
> - .bss_start : {
> - KEEP(*(.__bss_start));
> - }
> -
> .bss : {
> + .bss_start = .;
> *(.bss*)
> . = ALIGN(8);
> - }
> -
> - .bss_end : {
> - KEEP(*(.__bss_end));
> + .bss_end = .;
> }
>
> /DISCARD/ : { *(.dynsym) }
Apologies the patch above was wrong. The . in bss_start/end isn't
needed and I was missing a __ before the symbol definition.
The diff below though should produce the same binary without the
bss_start/end sections and the .bss section marked as ALLOC only
diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
index fb6a30c922f7..8105cfd122af 100644
--- a/arch/arm/cpu/armv8/u-boot.lds
+++ b/arch/arm/cpu/armv8/u-boot.lds
@@ -151,17 +151,11 @@ SECTIONS
. = ALIGN(8);
- .bss_start : {
- KEEP(*(.__bss_start));
- }
-
.bss : {
+ __bss_start = .;
*(.bss*)
. = ALIGN(8);
- }
-
- .bss_end : {
- KEEP(*(.__bss_end));
+ __bss_end = .;
}
/DISCARD/ : { *(.dynsym) }
diff --git a/arch/arm/lib/sections.c b/arch/arm/lib/sections.c
index 857879711c6a..59dfc53851a8 100644
--- a/arch/arm/lib/sections.c
+++ b/arch/arm/lib/sections.c
@@ -19,8 +19,8 @@
* aliasing warnings.
*/
-char __bss_start[0] __section(".__bss_start");
-char __bss_end[0] __section(".__bss_end");
+//char __bss_start[0] __section(".__bss_start");
+//char __bss_end[0] __section(".__bss_end");
char __image_copy_start[0] __section(".__image_copy_start");
char __image_copy_end[0] __section(".__image_copy_end");
char __rel_dyn_start[0] __section(".__rel_dyn_start");
>
>
> leads to this:
>
> 11 .bss 000090b0 0000000000102b00 0000000000102b00 00112aa0 2**7
> ALLOC
>
> P.S: I am playing around with rewriting the linker script and mapping
> u-boot with proper permissions at least for armv8. If this patch is neeeded
> *now* can someone explain why? Otherwise I'll clean it up once I test my
> patches enough
>
> Thanks
> /Ilias
>
> > $ aarch64-linux-gnu-objdump -Sh u-boot
> >
> > Before:
> > 10 .bss_start 00000000 00000000000f21d8 00000000000f21d8 001021d8 2**0
> > CONTENTS, ALLOC, LOAD, DATA
> > 11 .bss 000068f8 00000000000f2200 00000000000f2200 001021d8 2**6
> > ALLOC
> > 12 .bss_end 00000000 00000000000f8af8 00000000000f8af8 00108af8 2**0
> > CONTENTS, ALLOC, LOAD, DATA
> >
> > After:
> > 10 .bss_start 00000000 00000000000bf990 00000000000bf990 001021e0 2**0
> > CONTENTS
> > 11 .bss 000068e8 00000000000bf990 00000000000bf990 001021e0 2**4
> > CONTENTS
> > 12 .bss_end 00000000 00000000000c6278 00000000000c6278 00108ac8 2**0
> > CONTENTS
> >
> > Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> > ---
> > Cc: Simon Glass <sjg at chromium.org>
> > Cc: Tom Rini <trini at konsulko.com>
> > ---
> > V2: Replicate arch/arm/cpu/u-boot.lds BSS part verbatim
> > ---
> > arch/arm/cpu/armv8/u-boot.lds | 8 +++++---
> > 1 file changed, 5 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> > index fb6a30c922f..ebdc079552d 100644
> > --- a/arch/arm/cpu/armv8/u-boot.lds
> > +++ b/arch/arm/cpu/armv8/u-boot.lds
> > @@ -151,16 +151,18 @@ SECTIONS
> >
> > . = ALIGN(8);
> >
> > - .bss_start : {
> > + .bss_start __rel_dyn_start (OVERLAY) : {
> > KEEP(*(.__bss_start));
> > + __bss_base = .;
> > }
> >
> > - .bss : {
> > + .bss __bss_base (OVERLAY) : {
> > *(.bss*)
> > . = ALIGN(8);
> > + __bss_limit = .;
> > }
> >
> > - .bss_end : {
> > + .bss_end __bss_limit (OVERLAY) : {
> > KEEP(*(.__bss_end));
> > }
> >
> > --
> > 2.43.0
> >
More information about the U-Boot
mailing list