From: Willy Tarreau <w@1wt.eu>
To: "Thomas Weißschuh" <linux@weissschuh.net>
Cc: Daniel Palmer <daniel@0x0f.com>,
linux-kernel@vger.kernel.org, linux-sh@vger.kernel.org
Subject: Re: [PATCH] tools/nolibc: sh: enter _start_c with jsr instead of bsr
Date: Fri, 23 Oct 2026 07:09:55 +0200 [thread overview]
Message-ID: <atrsI4aaq9t4BVra@1wt.eu> (raw)
In-Reply-To: <cd8fcccd-aa70-46f9-b497-ec3070b5f8db@t-8ch.de>
Hi guys,
On Thu, Oct 22, 2026 at 06:12:27PM +0200, Thomas Weißschuh wrote:
> Hi Daniel!
>
> On 2026-10-22 19:01:59+0900, Daniel Palmer wrote:
> > bsr has limited displacement and cannot reach _start_c if its
> > more than +/-4KiB away.
> >
> > This starts to show up if you have big programs (static binary
> > of the game Quake in my case) and/or use LTO and things get moved
> > around.
>
> That is certainly a usecase that justifies making the two other SH4
> nolibc users' binaries a bit larger :-)
Indeed!
> > Replace bsr with a calculation of the effective address of
> > _start_c and jsr.
> >
> > Tested on QEMU and real SH4 and SH4a machines.
> >
> > Signed-off-by: Daniel Palmer <daniel@0x0f.com>
> > ---
> >
> > I'm no SuperH asm expert but this works for me. :)
> > Maybe there is a way in C to get _start and _start_c to always
> > be close together that would avoid this entirely?
>
> That would be my preference, too.
>
> Maybe one of these works:
>
> 1) Put both _start() and _start_c() in a dedicated .text subsection.
>
> Apparently the default GNU ld linkerscript contains '*(SORT(.text.sorted.*))'.
> So if we use .text.sorted.nolibc_start for both functions they should
> end up next to each other.
> See https://sourceware.org/binutils/docs/ld/Input-Section-Wildcards.html.
>
> 2) Put _start() *into* _start_c:
>
> diff --git a/tools/include/nolibc/crt.h b/tools/include/nolibc/crt.h
> index 714256228914..ebcd0ea2b9f2 100644
> --- a/tools/include/nolibc/crt.h
> +++ b/tools/include/nolibc/crt.h
> @@ -115,6 +115,19 @@ void _start_c(long *sp)
> (*--dtor_func)();
>
> exit(exitcode);
> +
> + __asm__ volatile (
> + ".global _start\n" /* The C function will have a prologue, */
> + ".type _start, @function\n" /* corrupting "sp" */
> + ".weak _start\n"
> + "_start:\n"
> +
> + "mov sp, r4\n" /* save argc pointer to r4, as arg1 of _start_c */
> + "bsr _start_c\n" /* transfer to c runtime */
> + "nop\n" /* delay slot */
> +
> + ".size _start, .-_start\n"
> + );
> }
>
> #endif /* NOLIBC_NO_RUNTIME */
>
> But that for all architectures, using macros etc.
>
> If the .text.sorted. solution works, I'd prefer that.
Do be honest, I think that Daniel's proposal remains the most maintainable
one. We rarely touch the start code, and having only a few do arch-
specific tricks is likely less of a burden for the long term than
relying on linker's ordering of sections, or starting to play macro
games. And it gets a chance that someone more familiar with that arch
improves it later if needed. But I'm not opiniated on this at all :-)
Thanks,
Willy
next prev parent reply other threads:[~2026-10-23 5:09 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 10:01 [PATCH] tools/nolibc: sh: enter _start_c with jsr instead of bsr Daniel Palmer
2026-10-22 16:12 ` Thomas Weißschuh
2026-10-23 5:09 ` Willy Tarreau [this message]
2026-10-23 15:53 ` Thomas Weißschuh
2026-10-23 16:20 ` Willy Tarreau
2026-10-23 17:32 ` Thomas Weißschuh
2026-10-23 18:35 ` Willy Tarreau
2026-10-24 5:16 ` Daniel Palmer
2026-10-24 5:27 ` Willy Tarreau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=atrsI4aaq9t4BVra@1wt.eu \
--to=w@1wt.eu \
--cc=daniel@0x0f.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=linux@weissschuh.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.