From eb5e4ac495356dd0dae680ca316e18b848c9efa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 24 Jun 2021 10:44:16 +0200 Subject: [PATCH] link: Recognize -z origin|noexecstack|now|relro linker args. --- src/Compilation.zig | 8 ++++++++ src/link.zig | 4 ++++ src/link/Elf.zig | 20 ++++++++++++++++++++ src/main.zig | 16 ++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/src/Compilation.zig b/src/Compilation.zig index 7ac75130f2..26c8bf2a70 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -708,6 +708,10 @@ pub const InitOptions = struct { disable_c_depfile: bool = false, linker_z_nodelete: bool = false, linker_z_defs: bool = false, + linker_z_origin: bool = false, + linker_z_noexecstack: bool = false, + linker_z_now: bool = false, + linker_z_relro: bool = false, linker_tsaware: bool = false, linker_nxcompat: bool = false, linker_dynamicbase: bool = false, @@ -1382,6 +1386,10 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { .bind_global_refs_locally = options.linker_bind_global_refs_locally orelse false, .z_nodelete = options.linker_z_nodelete, .z_defs = options.linker_z_defs, + .z_origin = options.linker_z_origin, + .z_noexecstack = options.linker_z_noexecstack, + .z_now = options.linker_z_now, + .z_relro = options.linker_z_relro, .tsaware = options.linker_tsaware, .nxcompat = options.linker_nxcompat, .dynamicbase = options.linker_dynamicbase, diff --git a/src/link.zig b/src/link.zig index dbca4fc956..88159496f4 100644 --- a/src/link.zig +++ b/src/link.zig @@ -73,6 +73,10 @@ pub const Options = struct { rdynamic: bool, z_nodelete: bool, z_defs: bool, + z_origin: bool, + z_noexecstack: bool, + z_now: bool, + z_relro: bool, tsaware: bool, nxcompat: bool, dynamicbase: bool, diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 938fede8ab..f8cf70104f 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1345,6 +1345,10 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { man.hash.add(self.base.options.skip_linker_dependencies); man.hash.add(self.base.options.z_nodelete); man.hash.add(self.base.options.z_defs); + man.hash.add(self.base.options.z_origin); + man.hash.add(self.base.options.z_noexecstack); + man.hash.add(self.base.options.z_now); + man.hash.add(self.base.options.z_relro); if (self.base.options.link_libc) { man.hash.add(self.base.options.libc_installation != null); if (self.base.options.libc_installation) |libc_installation| { @@ -1482,6 +1486,22 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { try argv.append("-z"); try argv.append("defs"); } + if (self.base.options.z_origin) { + try argv.append("-z"); + try argv.append("origin"); + } + if (self.base.options.z_noexecstack) { + try argv.append("-z"); + try argv.append("noexecstack"); + } + if (self.base.options.z_now) { + try argv.append("-z"); + try argv.append("now"); + } + if (self.base.options.z_relro) { + try argv.append("-z"); + try argv.append("relro"); + } if (getLDMOption(target)) |ldm| { // Any target ELF will use the freebsd osabi if suffixed with "_fbsd". diff --git a/src/main.zig b/src/main.zig index d58c3525c5..8b5fbba90d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -589,6 +589,10 @@ fn buildOutputType( var linker_bind_global_refs_locally: ?bool = null; var linker_z_nodelete = false; var linker_z_defs = false; + var linker_z_origin = false; + var linker_z_noexecstack = false; + var linker_z_now = false; + var linker_z_relro = false; var linker_tsaware = false; var linker_nxcompat = false; var linker_dynamicbase = false; @@ -1393,6 +1397,14 @@ fn buildOutputType( linker_z_nodelete = true; } else if (mem.eql(u8, z_arg, "defs")) { linker_z_defs = true; + } else if (mem.eql(u8, z_arg, "origin")) { + linker_z_origin = true; + } else if (mem.eql(u8, z_arg, "noexecstack")) { + linker_z_noexecstack = true; + } else if (mem.eql(u8, z_arg, "now")) { + linker_z_now = true; + } else if (mem.eql(u8, z_arg, "relro")) { + linker_z_relro = true; } else { warn("unsupported linker arg: -z {s}", .{z_arg}); } @@ -2077,6 +2089,10 @@ fn buildOutputType( .linker_bind_global_refs_locally = linker_bind_global_refs_locally, .linker_z_nodelete = linker_z_nodelete, .linker_z_defs = linker_z_defs, + .linker_z_origin = linker_z_origin, + .linker_z_noexecstack = linker_z_noexecstack, + .linker_z_now = linker_z_now, + .linker_z_relro = linker_z_relro, .linker_tsaware = linker_tsaware, .linker_nxcompat = linker_nxcompat, .linker_dynamicbase = linker_dynamicbase,