mirror of
https://github.com/ziglang/zig.git
synced 2024-11-17 09:32:51 +00:00
wasm-ld: Append --stack-first
by default
By placing the stack at the start of the memory section, we prevent the runtime from silently overwriting the global declarations and instead trap. We do however, allow users to overwrite this behavior by setting the global-base, which puts the stack at the end of the memory section and the static data at the base that was specified. The reason a user would want to do this, is when they are sure the stack will not overflow and they want to decrease the binary size as the offsets to the static memory are generally smaller. (Having the stack in front, means that accessing the memory after the stack has a bigger offset when loading/storing from memory).
This commit is contained in:
parent
f767f8e3dc
commit
975049e96e
@ -1243,6 +1243,12 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
|
||||
if (self.base.options.global_base) |global_base| {
|
||||
const arg = try std.fmt.allocPrint(arena, "--global-base={d}", .{global_base});
|
||||
try argv.append(arg);
|
||||
} else {
|
||||
// We prepend it by default, so when a stack overflow happens the runtime will trap correctly,
|
||||
// rather than silently overwrite all global declarations. See https://github.com/ziglang/zig/issues/4496
|
||||
//
|
||||
// The user can overwrite this behavior by setting the global-base
|
||||
try argv.append("--stack-first");
|
||||
}
|
||||
|
||||
var auto_export_symbols = true;
|
||||
@ -1294,10 +1300,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
|
||||
const arg = try std.fmt.allocPrint(arena, "stack-size={d}", .{stack_size});
|
||||
try argv.append(arg);
|
||||
|
||||
// Put stack before globals so that stack overflow results in segfault immediately
|
||||
// before corrupting globals. See https://github.com/ziglang/zig/issues/4496
|
||||
try argv.append("--stack-first");
|
||||
|
||||
if (self.base.options.wasi_exec_model == .reactor) {
|
||||
// Reactor execution model does not have _start so lld doesn't look for it.
|
||||
try argv.append("--no-entry");
|
||||
|
Loading…
Reference in New Issue
Block a user