The below patch should fix the issue.

diff --git a/tools/musl-gcc.specs.sh b/tools/musl-gcc.specs.sh
index 30492574..ffb46d70 100644
--- a/tools/musl-gcc.specs.sh
+++ b/tools/musl-gcc.specs.sh
@@ -23,7 +23,7 @@ libgcc.a%s %:if-exists(libgcc_eh.a%s)
 crtendS.o%s $libdir/crtn.o

 *link:
--dynamic-linker $ldso -nostdlib %{shared:-shared} %{static:-static} %{rdynamic:-export-dynamic}
+%{!static:-dynamic-linker $ldso} -nostdlib %{shared:-shared} %{static:-static} %{rdynamic:-export-dynamic}

 *esp_link:

On Sun, Nov 13, 2022 at 8:46 AM Rui Ueyama <rui314@gmail.com> wrote:
Let me try to create a patch.

On Sun, Nov 13, 2022 at 8:38 AM Rich Felker <dalias@libc.org> wrote:
On Sun, Nov 13, 2022 at 08:11:29AM +0800, Rui Ueyama wrote:
> Hi,
>
> I think I found a musl-gcc issue. It looks like musl-gcc always appends
> `-dynamic-linker /lib/ld-musl-x86_64.so.1` even if `-static` is given. That
> causes a created program to immediately crash on startup as you can see
> below:
>
> $ cat hello.c
> #include <stdio.h>
> int main() { printf("Hello\n"); }
>
> $ musl-gcc -static -fuse-ld=lld hello.c -o hello
>
> $ ./hello
> Segmentation fault (core dumped)
>
> $ musl-gcc -static -fuse-ld=lld hello.c -o hello -Wl,-no-dynamic-linker
> $ ./hello
> Hello
>
> This also happens to my new linker, mold, as well. `-dynamic-linker` option
> is passed to the linker, and lld and mold do what it is told to do, so I
> don't think it is a linker's bug. Rather, it's a compiler front end's bug
> that passes the unnecessary command line option. Can you not to append
> `-dynamic-linker` if `-static`?

Yes, I think this should be fixed. It only works with bfd ld without
static pie (which we're also missing support for) because it just
ignores -dynamic-linker in the ET_EXEC case.

Would you be willing to propose a candidate patch? I believe this has
been raised before in the context of static pie not working with
musl-gcc (it didn't exist when the wrapper was added) so ideally that
will get fixed too.

Rich