link: Recognize -z origin|noexecstack|now|relro linker args.

This commit is contained in:
Alex Rønne Petersen 2021-06-24 10:44:16 +02:00 committed by Veikka Tuominen
parent 594271f8db
commit eb5e4ac495
4 changed files with 48 additions and 0 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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".

View File

@ -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,