mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
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:
parent
beb7495e19
commit
5ae3e4e9bd
@ -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}));
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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}));
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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.
|
||||
|
||||
13
src/main.zig
13
src/main.zig
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user