diff options
| author | Kenta Iwasaki <kenta@lithdew.net> | 2022-01-01 06:32:37 +0900 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-01-19 11:22:10 -0700 |
| commit | 5ae3e4e9bd5216c7cc2305c8996ed413c89c59e7 (patch) | |
| tree | fc0a9852022f89d33d249540527296e7477e7f19 /src | |
| parent | beb7495e19d23b4814e16772888e80688ad10e47 (diff) | |
| download | zig-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.zig | 2 | ||||
| -rw-r--r-- | src/link.zig | 1 | ||||
| -rw-r--r-- | src/link/Coff.zig | 1 | ||||
| -rw-r--r-- | src/link/Elf.zig | 6 | ||||
| -rw-r--r-- | src/link/MachO.zig | 1 | ||||
| -rw-r--r-- | src/link/Wasm.zig | 6 | ||||
| -rw-r--r-- | src/main.zig | 13 |
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, |
