aboutsummaryrefslogtreecommitdiff
path: root/lib/std/start.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-07-29 18:40:27 -0700
committerGitHub <noreply@github.com>2024-07-29 18:40:27 -0700
commitf219286573a7a1edafe3e1b5bc1e521a379ee2e2 (patch)
tree574312bd81d50c9d05370b7f404d9161330d5bd6 /lib/std/start.zig
parent38e0f049c531e83ec2eec80d50b624e6c3b8c486 (diff)
parent3f2d1b17fc304c8a71e6fcce4a17500b19c3fbac (diff)
downloadzig-f219286573a7a1edafe3e1b5bc1e521a379ee2e2.tar.gz
zig-f219286573a7a1edafe3e1b5bc1e521a379ee2e2.zip
Merge pull request #20852 from ziglang/init-array-start-code
start code: implement __init_array_start, __init_array_end
Diffstat (limited to 'lib/std/start.zig')
-rw-r--r--lib/std/start.zig17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/std/start.zig b/lib/std/start.zig
index 2a61be46e4..8d55c178e4 100644
--- a/lib/std/start.zig
+++ b/lib/std/start.zig
@@ -464,6 +464,23 @@ fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn {
// Here we look for the stack size in our program headers and use setrlimit
// to ask for more stack space.
expandStackSize(phdrs);
+
+ // Disabled with the riscv backend because it cannot handle this code yet.
+ if (builtin.zig_backend != .stage2_riscv64) {
+ const opt_init_array_start = @extern([*]*const fn () callconv(.C) void, .{
+ .name = "__init_array_start",
+ .linkage = .weak,
+ });
+ const opt_init_array_end = @extern([*]*const fn () callconv(.C) void, .{
+ .name = "__init_array_end",
+ .linkage = .weak,
+ });
+ if (opt_init_array_start) |init_array_start| {
+ const init_array_end = opt_init_array_end.?;
+ const slice = init_array_start[0 .. init_array_end - init_array_start];
+ for (slice) |func| func();
+ }
+ }
}
std.posix.exit(callMainWithArgs(argc, argv, envp));