From nobody Sun Feb 8 21:46:59 2026 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 67C713164DF for ; Sat, 31 Jan 2026 07:44:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769845489; cv=none; b=BgKMvzVIW6FcC0jhOS0vxBXc8rmlkyEVf/PkEYDkvISV9EOSWjcSVD5Gp9e9GXcB5nlVerNW1nMpPEqddeC2LHAkMWx7X+EmIgUIMF1iWDZktKsPhsKFMAwlUFY45EbY2W5QfQE9yVHDNWhudnOnczjwEx83mXzlr7VaOEVckgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769845489; c=relaxed/simple; bh=72UWWJ+8LmTwAyCkiwkg5mSxQXJgCQ69wZWVDETb+bI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sVm48Vi6Rp+rVCAAzPaHIiuUYisVpWo+rd5P3yGaig6krcBiGll8tImX9I7cWWRz7GW/KYBMEPNSl62r/m8Xrpvigny9+EHqo2UaGLwIU9affnSkVr4ktdJ4lPcAais78Vp7R4ciBuHdUGuqRDFf3QBavJdl3/GsHFBZblX3ZpU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=thingy.jp; spf=pass smtp.mailfrom=0x0f.com; dkim=pass (1024-bit key) header.d=thingy.jp header.i=@thingy.jp header.b=MVauphBx; arc=none smtp.client-ip=209.85.215.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=thingy.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=0x0f.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=thingy.jp header.i=@thingy.jp header.b="MVauphBx" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-bc274b8b15bso1833423a12.1 for ; Fri, 30 Jan 2026 23:44:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=thingy.jp; s=google; t=1769845488; x=1770450288; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2d4KMj/9z0oQQ8YX8g7Bn6O96fvjyVSdgpmhxsPmDT0=; b=MVauphBxfr6JSHUNSHxv+asV6ywWmjWt7bFL4A8gWmPryEzp5ueZ/OhQHxSIsk5jta K7J7cI1H+ZJ8fEpwlxi3uf5sdF5ltTZhgqtPCXB3HCiCvMVsv6Q0bagVaiWJSENM/wAN 9M63TE9vNyRmT8DVS9uEbyQD0ujcoBCqvsJg0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769845488; x=1770450288; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2d4KMj/9z0oQQ8YX8g7Bn6O96fvjyVSdgpmhxsPmDT0=; b=I4lWxTZ6waW2f6FFUpsSlvIyYRX6IFvWe0jIO7xWstPBK/0mBIIP1U1JrT3tDpykGN ozbF1nwZMNleYUOKSq8SIW8DouSaFHAG3e8dhTcNIZ2fGC6fjpp3Q66o8LyCBQgBhtly 98KRGz7C2AgJZmBrnrlf+5jSUlD2kvMu0ugByaADSeGN/8J0lr1M5gyPlw4zTJ0Zg8R7 i6Pq1YLKZv/uBxPRuUZ3tWob8+xkOM0AcBQvl/QmJYVHBd8nS6TZimgbgYbZ+kMArmVI ibguuoNn/N0GXaPy2nrB6sCzgF3Bn4P//vuvic9gJPnVjLANWcibs0wKQ050gkqHNCCw i+Zw== X-Forwarded-Encrypted: i=1; AJvYcCX24WT6ORJB3QYxcXYC468xCzeb4p81PpIsSAUDHntwW+D0D2rAVjABeFM+OiciXeUeVmIlHYIc0hmkZFI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxl6+Sjp0YDl9T9l0Z1zNePsRp4EnaL2nhtQA2h02tgiAe3RAgo Nvu7+l3AvJl4JK/W6O4hOm7q6ZQsJcM8QCjuQv74Doeln8RC/n+yvg4AVFgWDH1ivi8= X-Gm-Gg: AZuq6aJkbXOndcGyOQxCyLCijz4QcLEifHPile/tFqZAWbwMb12bFcIC/CE0z2EmTqz WDvPD05IZZyyBUzGLDDw5wSrjuGZqAI35YpH9Kf4h+VheLsZ2MsrmK1p24HzdwhG9DtQ0+vQKc0 vitUzyYwLcaBJD+a1q7xWi2vC8R1B6BuYsCS8a5kshjWoXsxA/5Ubb03do0uM7kuBM034cLSIB1 fqBF6Nt7xKegtpwMwNwaOtHKmTGxK0iG7WigucfYwGqCyQ/ttA9gjxgzEDIGHgUErqD8LH83DOR WfYT/LC8NRZRCjMcSpSgAOtU2iJDlUHphBEUNbuyReft6UrJYc1XOu3GJt488LMkd8+Oma+MC/1 fxBRQE9RynPa61w0q0mXnuRGJepEhr3fAvE7ctN1pcUJxRMjBDarw6IxbC8spZ4XbBQP5U+53qK FxbMKmDz+W/CyLIom+DH2Vovp16j5wIzRzOboeGf9XyKrh8JSGNfWXkiRRRLcHpJxSygMMJqhCL E/O X-Received: by 2002:a05:6a20:258b:b0:34f:ec32:6a3c with SMTP id adf61e73a8af0-392e005b44fmr5498766637.28.1769845487708; Fri, 30 Jan 2026 23:44:47 -0800 (PST) Received: from kinako.work.home.arpa (p1490223-ipxg00b01sizuokaden.shizuoka.ocn.ne.jp. [153.223.134.223]) by smtp.googlemail.com with ESMTPSA id 41be03b00d2f7-c642a9f539dsm8866928a12.26.2026.01.30.23.44.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Jan 2026 23:44:47 -0800 (PST) From: Daniel Palmer To: linux@weissschuh.net, w@1wt.eu Cc: kees@kernel.org, linux-kernel@vger.kernel.org, Daniel Palmer Subject: [RFC PATCH 2/9] tools/nolibc: crt: Split _start_c() into stack-only and normal part Date: Sat, 31 Jan 2026 16:44:33 +0900 Message-ID: <20260131074440.732588-3-daniel@thingy.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260131074440.732588-1-daniel@thingy.jp> References: <20260131074440.732588-1-daniel@thingy.jp> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To prepare for nolibc programs being able to relocate themselves we need to split _start_c() into two parts: - One part that only uses the stack so there are no accesses via the GOT etc that isn't setup yet. Note that on m68k at least this also means forcing the stackprotector off because accessing the stack protector canary is done via the GOT. - Another part that is called after we have done relocation so it is safe to access global variables etc that might use the GOT etc. Signed-off-by: Daniel Palmer --- tools/include/nolibc/crt.h | 57 +++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/tools/include/nolibc/crt.h b/tools/include/nolibc/crt.h index d9262998dae9..899062c00fb7 100644 --- a/tools/include/nolibc/crt.h +++ b/tools/include/nolibc/crt.h @@ -27,26 +27,51 @@ extern void (*const __init_array_end[])(int, char **, c= har**) __attribute__((wea extern void (*const __fini_array_start[])(void) __attribute__((weak)); extern void (*const __fini_array_end[])(void) __attribute__((weak)); =20 -void _start_c(long *sp); -__attribute__((weak,used)) +void __start_c(long argc, char **argv, char **envp, const unsigned long *a= uxv); +__attribute__((weak, used)) #if __nolibc_has_feature(undefined_behavior_sanitizer) __attribute__((no_sanitize("function"))) #endif -void _start_c(long *sp) +void __no_stack_protector __start_c(long argc, char **argv, char **envp, c= onst unsigned long *auxv) { - long argc; - char **argv; - char **envp; - int exitcode; void (* const *ctor_func)(int, char **, char **); void (* const *dtor_func)(void); - const unsigned long *auxv; /* silence potential warning: conflicting types for 'main' */ int _nolibc_main(int, char **, char **) __asm__ ("main"); + int exitcode; =20 /* initialize stack protector */ __stack_chk_init(); =20 + environ =3D envp; + _auxv =3D auxv; + + for (ctor_func =3D __preinit_array_start; ctor_func < __preinit_array_end= ; ctor_func++) + (*ctor_func)(argc, argv, envp); + for (ctor_func =3D __init_array_start; ctor_func < __init_array_end; ctor= _func++) + (*ctor_func)(argc, argv, envp); + + /* go to application */ + exitcode =3D _nolibc_main(argc, argv, envp); + + for (dtor_func =3D __fini_array_end; dtor_func > __fini_array_start;) + (*--dtor_func)(); + + exit(exitcode); +} + +void _start_c(long *sp); +__attribute__((weak, used)) +#if __nolibc_has_feature(undefined_behavior_sanitizer) + __attribute__((no_sanitize("function"))) +#endif +void __no_stack_protector _start_c(long *sp) +{ + long argc; + char **argv; + char **envp; + const unsigned long *auxv; + /* * sp : argc <-- argument count, required by main() * argv: argv[0] <-- argument vector, required by main() @@ -69,25 +94,13 @@ void _start_c(long *sp) argv =3D (void *)(sp + 1); =20 /* find environ */ - environ =3D envp =3D argv + argc + 1; + envp =3D argv + argc + 1; =20 /* find _auxv */ for (auxv =3D (void *)envp; *auxv++;) ; - _auxv =3D auxv; =20 - for (ctor_func =3D __preinit_array_start; ctor_func < __preinit_array_end= ; ctor_func++) - (*ctor_func)(argc, argv, envp); - for (ctor_func =3D __init_array_start; ctor_func < __init_array_end; ctor= _func++) - (*ctor_func)(argc, argv, envp); - - /* go to application */ - exitcode =3D _nolibc_main(argc, argv, envp); - - for (dtor_func =3D __fini_array_end; dtor_func > __fini_array_start;) - (*--dtor_func)(); - - exit(exitcode); + __start_c(argc, argv, envp, auxv); } =20 #endif /* NOLIBC_NO_RUNTIME */ --=20 2.51.0