lld: allow for entrypoint symbol name to be set

This commit enables for the entrypoint symbol to be set when linking ELF
or WebAssembly modules with lld using the Zig compiler.
This commit is contained in:
Kenta Iwasaki 2022-01-01 06:32:37 +09:00 committed by Andrew Kelley
parent beb7495e19
commit 5ae3e4e9bd
8 changed files with 38 additions and 0 deletions

View File

@ -1554,6 +1554,9 @@ pub const LibExeObjStep = struct {
subsystem: ?std.Target.SubSystem = null,
/// Entrypoint symbol name
entry: ?[]const u8 = null,
/// Overrides the default stack size
stack_size: ?u64 = null,
@ -2255,6 +2258,11 @@ pub const LibExeObjStep = struct {
try zig_args.append(@tagName(builder.color));
}
if (self.entry) |entry| {
try zig_args.append("--entry");
try zig_args.append(entry);
}
if (self.stack_size) |stack_size| {
try zig_args.append("--stack");
try zig_args.append(try std.fmt.allocPrint(builder.allocator, "{}", .{stack_size}));

View File

@ -791,6 +791,7 @@ pub const InitOptions = struct {
/// infinite recursion.
skip_linker_dependencies: bool = false,
parent_compilation_link_libc: bool = false,
entry: ?[]const u8 = null,
stack_size_override: ?u64 = null,
image_base_override: ?u64 = null,
self_exe_path: ?[]const u8 = null,
@ -1572,6 +1573,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
.linker_optimization = linker_optimization,
.major_subsystem_version = options.major_subsystem_version,
.minor_subsystem_version = options.minor_subsystem_version,
.entry = options.entry,
.stack_size_override = options.stack_size_override,
.image_base_override = options.image_base_override,
.include_compiler_rt = include_compiler_rt,

View File

@ -84,6 +84,7 @@ pub const Options = struct {
/// the binary file does not already have such a section.
program_code_size_hint: u64 = 256 * 1024,
entry_addr: ?u64 = null,
entry: ?[]const u8,
stack_size_override: ?u64,
image_base_override: ?u64,
cache_mode: CacheMode,

View File

@ -951,6 +951,7 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
_ = try man.addFile(key.status.success.object_path, null);
}
try man.addOptionalFile(module_obj_path);
man.hash.addOptionalBytes(self.base.options.entry);
man.hash.addOptional(self.base.options.stack_size_override);
man.hash.addOptional(self.base.options.image_base_override);
man.hash.addListOfBytes(self.base.options.lib_dirs);

View File

@ -1396,6 +1396,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
// We can skip hashing libc and libc++ components that we are in charge of building from Zig
// installation sources because they are always a product of the compiler version + target information.
man.hash.addOptionalBytes(self.base.options.entry);
man.hash.add(stack_size);
man.hash.addOptional(self.base.options.image_base_override);
man.hash.add(gc_sections);
@ -1518,6 +1519,11 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
self.base.options.linker_optimization,
}));
if (self.base.options.entry) |entry| {
try argv.append("--entry");
try argv.append(entry);
}
if (self.base.options.output_mode == .Exe) {
try argv.append("-z");
try argv.append(try std.fmt.allocPrint(arena, "stack-size={d}", .{stack_size}));

View File

@ -509,6 +509,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
try man.addOptionalFile(module_obj_path);
// We can skip hashing libc and libc++ components that we are in charge of building from Zig
// installation sources because they are always a product of the compiler version + target information.
man.hash.addOptionalBytes(self.base.options.entry);
man.hash.add(stack_size);
man.hash.addListOfBytes(self.base.options.lib_dirs);
man.hash.addListOfBytes(self.base.options.framework_dirs);

View File

@ -1137,6 +1137,7 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
}
try man.addOptionalFile(module_obj_path);
try man.addOptionalFile(compiler_rt_path);
man.hash.addOptionalBytes(self.base.options.entry);
man.hash.addOptional(self.base.options.stack_size_override);
man.hash.add(self.base.options.import_memory);
man.hash.add(self.base.options.import_table);
@ -1295,6 +1296,11 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
}
}
if (self.base.options.entry) |entry| {
try argv.append("--entry");
try argv.append(entry);
}
if (self.base.options.output_mode == .Exe) {
// Increase the default stack size to a more reasonable value of 1MB instead of
// the default of 1 Wasm page being 64KB, unless overridden by the user.

View File

@ -400,6 +400,7 @@ const usage_build_generic =
\\ --dynamic-linker [path] Set the dynamic interpreter path (usually ld.so)
\\ --sysroot [path] Set the system root directory (usually /)
\\ --version [ver] Dynamic library semver
\\ --entry [name] Set the entrypoint symbol name
\\ -fsoname[=name] Override the default SONAME value
\\ -fno-soname Disable emitting a SONAME
\\ -fLLD Force using LLD as the linker
@ -647,6 +648,7 @@ fn buildOutputType(
var linker_optimization: ?u8 = null;
var test_evented_io = false;
var test_no_exec = false;
var entry: ?[]const u8 = null;
var stack_size_override: ?u64 = null;
var image_base_override: ?u64 = null;
var use_llvm: ?bool = null;
@ -847,6 +849,10 @@ fn buildOutputType(
if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
i += 1;
optimize_mode_string = args[i];
} else if (mem.eql(u8, arg, "--entry")) {
if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
i += 1;
entry = args[i];
} else if (mem.eql(u8, arg, "--stack")) {
if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
i += 1;
@ -1624,6 +1630,12 @@ fn buildOutputType(
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
have_version = true;
} else if (mem.eql(u8, arg, "-e") or mem.eql(u8, arg, "--entry")) {
i += 1;
if (i >= linker_args.items.len) {
fatal("expected linker arg after '{s}'", .{arg});
}
entry = linker_args.items[i];
} else if (mem.eql(u8, arg, "--stack")) {
i += 1;
if (i >= linker_args.items.len) {
@ -2500,6 +2512,7 @@ fn buildOutputType(
.minor_subsystem_version = minor_subsystem_version,
.link_eh_frame_hdr = link_eh_frame_hdr,
.link_emit_relocs = link_emit_relocs,
.entry = entry,
.stack_size_override = stack_size_override,
.image_base_override = image_base_override,
.strip = strip,