authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2021-06-24 10:44:16+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-09-04 12:18:38+03:00
logeb5e4ac495356dd0dae680ca316e18b848c9efa3
treed4d9baab92fae3185fac1bc59f622f681314d1da
parent594271f8dba0143280990ac2e01dd68a791c05b0

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


4 files changed, 48 insertions(+), 0 deletions(-)

src/Compilation.zig+8
...@@ -708,6 +708,10 @@ pub const InitOptions = struct {...@@ -708,6 +708,10 @@ pub const InitOptions = struct {
708 disable_c_depfile: bool = false,708 disable_c_depfile: bool = false,
709 linker_z_nodelete: bool = false,709 linker_z_nodelete: bool = false,
710 linker_z_defs: bool = false,710 linker_z_defs: bool = false,
711 linker_z_origin: bool = false,
712 linker_z_noexecstack: bool = false,
713 linker_z_now: bool = false,
714 linker_z_relro: bool = false,
711 linker_tsaware: bool = false,715 linker_tsaware: bool = false,
712 linker_nxcompat: bool = false,716 linker_nxcompat: bool = false,
713 linker_dynamicbase: bool = false,717 linker_dynamicbase: bool = false,
...@@ -1382,6 +1386,10 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {...@@ -1382,6 +1386,10 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
1382 .bind_global_refs_locally = options.linker_bind_global_refs_locally orelse false,1386 .bind_global_refs_locally = options.linker_bind_global_refs_locally orelse false,
1383 .z_nodelete = options.linker_z_nodelete,1387 .z_nodelete = options.linker_z_nodelete,
1384 .z_defs = options.linker_z_defs,1388 .z_defs = options.linker_z_defs,
1389 .z_origin = options.linker_z_origin,
1390 .z_noexecstack = options.linker_z_noexecstack,
1391 .z_now = options.linker_z_now,
1392 .z_relro = options.linker_z_relro,
1385 .tsaware = options.linker_tsaware,1393 .tsaware = options.linker_tsaware,
1386 .nxcompat = options.linker_nxcompat,1394 .nxcompat = options.linker_nxcompat,
1387 .dynamicbase = options.linker_dynamicbase,1395 .dynamicbase = options.linker_dynamicbase,
src/link.zig+4
...@@ -73,6 +73,10 @@ pub const Options = struct {...@@ -73,6 +73,10 @@ pub const Options = struct {
73 rdynamic: bool,73 rdynamic: bool,
74 z_nodelete: bool,74 z_nodelete: bool,
75 z_defs: bool,75 z_defs: bool,
76 z_origin: bool,
77 z_noexecstack: bool,
78 z_now: bool,
79 z_relro: bool,
76 tsaware: bool,80 tsaware: bool,
77 nxcompat: bool,81 nxcompat: bool,
78 dynamicbase: bool,82 dynamicbase: bool,
src/link/Elf.zig+20
...@@ -1345,6 +1345,10 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {...@@ -1345,6 +1345,10 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
1345 man.hash.add(self.base.options.skip_linker_dependencies);1345 man.hash.add(self.base.options.skip_linker_dependencies);
1346 man.hash.add(self.base.options.z_nodelete);1346 man.hash.add(self.base.options.z_nodelete);
1347 man.hash.add(self.base.options.z_defs);1347 man.hash.add(self.base.options.z_defs);
1348 man.hash.add(self.base.options.z_origin);
1349 man.hash.add(self.base.options.z_noexecstack);
1350 man.hash.add(self.base.options.z_now);
1351 man.hash.add(self.base.options.z_relro);
1348 if (self.base.options.link_libc) {1352 if (self.base.options.link_libc) {
1349 man.hash.add(self.base.options.libc_installation != null);1353 man.hash.add(self.base.options.libc_installation != null);
1350 if (self.base.options.libc_installation) |libc_installation| {1354 if (self.base.options.libc_installation) |libc_installation| {
...@@ -1482,6 +1486,22 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {...@@ -1482,6 +1486,22 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
1482 try argv.append("-z");1486 try argv.append("-z");
1483 try argv.append("defs");1487 try argv.append("defs");
1484 }1488 }
1489 if (self.base.options.z_origin) {
1490 try argv.append("-z");
1491 try argv.append("origin");
1492 }
1493 if (self.base.options.z_noexecstack) {
1494 try argv.append("-z");
1495 try argv.append("noexecstack");
1496 }
1497 if (self.base.options.z_now) {
1498 try argv.append("-z");
1499 try argv.append("now");
1500 }
1501 if (self.base.options.z_relro) {
1502 try argv.append("-z");
1503 try argv.append("relro");
1504 }
14851505
1486 if (getLDMOption(target)) |ldm| {1506 if (getLDMOption(target)) |ldm| {
1487 // Any target ELF will use the freebsd osabi if suffixed with "_fbsd".1507 // Any target ELF will use the freebsd osabi if suffixed with "_fbsd".
src/main.zig+16
...@@ -589,6 +589,10 @@ fn buildOutputType(...@@ -589,6 +589,10 @@ fn buildOutputType(
589 var linker_bind_global_refs_locally: ?bool = null;589 var linker_bind_global_refs_locally: ?bool = null;
590 var linker_z_nodelete = false;590 var linker_z_nodelete = false;
591 var linker_z_defs = false;591 var linker_z_defs = false;
592 var linker_z_origin = false;
593 var linker_z_noexecstack = false;
594 var linker_z_now = false;
595 var linker_z_relro = false;
592 var linker_tsaware = false;596 var linker_tsaware = false;
593 var linker_nxcompat = false;597 var linker_nxcompat = false;
594 var linker_dynamicbase = false;598 var linker_dynamicbase = false;
...@@ -1393,6 +1397,14 @@ fn buildOutputType(...@@ -1393,6 +1397,14 @@ fn buildOutputType(
1393 linker_z_nodelete = true;1397 linker_z_nodelete = true;
1394 } else if (mem.eql(u8, z_arg, "defs")) {1398 } else if (mem.eql(u8, z_arg, "defs")) {
1395 linker_z_defs = true;1399 linker_z_defs = true;
1400 } else if (mem.eql(u8, z_arg, "origin")) {
1401 linker_z_origin = true;
1402 } else if (mem.eql(u8, z_arg, "noexecstack")) {
1403 linker_z_noexecstack = true;
1404 } else if (mem.eql(u8, z_arg, "now")) {
1405 linker_z_now = true;
1406 } else if (mem.eql(u8, z_arg, "relro")) {
1407 linker_z_relro = true;
1396 } else {1408 } else {
1397 warn("unsupported linker arg: -z {s}", .{z_arg});1409 warn("unsupported linker arg: -z {s}", .{z_arg});
1398 }1410 }
...@@ -2077,6 +2089,10 @@ fn buildOutputType(...@@ -2077,6 +2089,10 @@ fn buildOutputType(
2077 .linker_bind_global_refs_locally = linker_bind_global_refs_locally,2089 .linker_bind_global_refs_locally = linker_bind_global_refs_locally,
2078 .linker_z_nodelete = linker_z_nodelete,2090 .linker_z_nodelete = linker_z_nodelete,
2079 .linker_z_defs = linker_z_defs,2091 .linker_z_defs = linker_z_defs,
2092 .linker_z_origin = linker_z_origin,
2093 .linker_z_noexecstack = linker_z_noexecstack,
2094 .linker_z_now = linker_z_now,
2095 .linker_z_relro = linker_z_relro,
2080 .linker_tsaware = linker_tsaware,2096 .linker_tsaware = linker_tsaware,
2081 .linker_nxcompat = linker_nxcompat,2097 .linker_nxcompat = linker_nxcompat,
2082 .linker_dynamicbase = linker_dynamicbase,2098 .linker_dynamicbase = linker_dynamicbase,