aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKenta Iwasaki <kenta@lithdew.net>2022-01-01 06:32:37 +0900
committerAndrew Kelley <andrew@ziglang.org>2022-01-19 11:22:10 -0700
commit5ae3e4e9bd5216c7cc2305c8996ed413c89c59e7 (patch)
treefc0a9852022f89d33d249540527296e7477e7f19 /src
parentbeb7495e19d23b4814e16772888e80688ad10e47 (diff)
downloadzig-5ae3e4e9bd5216c7cc2305c8996ed413c89c59e7.tar.gz
zig-5ae3e4e9bd5216c7cc2305c8996ed413c89c59e7.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig2
-rw-r--r--src/link.zig1
-rw-r--r--src/link/Coff.zig1
-rw-r--r--src/link/Elf.zig6
-rw-r--r--src/link/MachO.zig1
-rw-r--r--src/link/Wasm.zig6
-rw-r--r--src/main.zig13
7 files changed, 30 insertions, 0 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index c21bf71326..2c64657903 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -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,
diff --git a/src/link.zig b/src/link.zig
index 3dc75c77e8..916dea0429 100644
--- a/src/link.zig
+++ b/src/link.zig
@@ -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,
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index 26b8c78a28..b6ae8abcb1 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -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);
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index d0f9d7851d..d675833ef2 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -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}));
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 6335151bef..eaeb5265eb 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -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);
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 34723cdb27..e9ebb669fe 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -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.
diff --git a/src/main.zig b/src/main.zig
index c924b14b69..3561315989 100644
--- a/src/main.zig
+++ b/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,