| author | |
| committer | |
| log | eb5e4ac495356dd0dae680ca316e18b848c9efa3 |
| tree | d4d9baab92fae3185fac1bc59f622f681314d1da |
| parent | 594271f8dba0143280990ac2e01dd68a791c05b0 |
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 | } | ||
| 1485 | 1505 | ||
| 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, |