aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2021-06-24 10:44:16 +0200
committerVeikka Tuominen <git@vexu.eu>2021-09-04 12:18:38 +0300
commiteb5e4ac495356dd0dae680ca316e18b848c9efa3 (patch)
treed4d9baab92fae3185fac1bc59f622f681314d1da /src
parent594271f8dba0143280990ac2e01dd68a791c05b0 (diff)
downloadzig-eb5e4ac495356dd0dae680ca316e18b848c9efa3.tar.gz
zig-eb5e4ac495356dd0dae680ca316e18b848c9efa3.zip
link: Recognize -z origin|noexecstack|now|relro linker args.
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig8
-rw-r--r--src/link.zig4
-rw-r--r--src/link/Elf.zig20
-rw-r--r--src/main.zig16
4 files changed, 48 insertions, 0 deletions
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,