Commit 113f80bcf7

kcbanner <kcbanner@gmail.com>
2023-03-03 04:15:31
coff: change dynamicbase to default to true (to match lld), change it to pass the negation to lld, and add --no-dynamicbase build: expose linker_dynamicbase on CompileStep and map it to emit --no-dynamicbase
1 parent 37f6f79
Changed files (3)
lib
std
src
link
Coff
lib/std/Build/CompileStep.zig
@@ -140,6 +140,8 @@ link_function_sections: bool = false,
 /// exported symbols.
 link_gc_sections: ?bool = null,
 
+linker_dynamicbase: ?bool = null,
+
 linker_allow_shlib_undefined: ?bool = null,
 
 /// Permit read-only relocations in read-only segments. Disallowed by default.
@@ -1474,6 +1476,9 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
     if (self.link_gc_sections) |x| {
         try zig_args.append(if (x) "--gc-sections" else "--no-gc-sections");
     }
+    if (self.linker_dynamicbase) |x| {
+        if (!x) try zig_args.append("--no-dynamicbase");
+    }
     if (self.linker_allow_shlib_undefined) |x| {
         try zig_args.append(if (x) "-fallow-shlib-undefined" else "-fno-allow-shlib-undefined");
     }
src/link/Coff/lld.zig
@@ -223,8 +223,8 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
         if (self.base.options.nxcompat) {
             try argv.append("-nxcompat");
         }
-        if (self.base.options.dynamicbase) {
-            try argv.append("-dynamicbase");
+        if (!self.base.options.dynamicbase) {
+            try argv.append("-dynamicbase:NO");
         }
 
         try argv.append(try allocPrint(arena, "-OUT:{s}", .{full_out_path}));
src/main.zig
@@ -778,7 +778,7 @@ fn buildOutputType(
     var linker_z_max_page_size: ?u64 = null;
     var linker_tsaware = false;
     var linker_nxcompat = false;
-    var linker_dynamicbase = false;
+    var linker_dynamicbase = true;
     var linker_optimization: ?u8 = null;
     var linker_module_definition_file: ?[]const u8 = null;
     var test_evented_io = false;
@@ -1371,6 +1371,8 @@ fn buildOutputType(
                         linker_opt_bisect_limit = std.math.lossyCast(i32, parseIntSuffix(arg, "-fopt-bisect-limit=".len));
                     } else if (mem.eql(u8, arg, "--eh-frame-hdr")) {
                         link_eh_frame_hdr = true;
+                    } else if (mem.eql(u8, arg, "--no-dynamicbase")) {
+                        linker_dynamicbase = false;
                     } else if (mem.eql(u8, arg, "--emit-relocs")) {
                         link_emit_relocs = true;
                     } else if (mem.eql(u8, arg, "-fallow-shlib-undefined")) {
@@ -2105,8 +2107,8 @@ fn buildOutputType(
                     linker_tsaware = true;
                 } else if (mem.eql(u8, arg, "--nxcompat")) {
                     linker_nxcompat = true;
-                } else if (mem.eql(u8, arg, "--dynamicbase")) {
-                    linker_dynamicbase = true;
+                } else if (mem.eql(u8, arg, "--no-dynamicbase")) {
+                    linker_dynamicbase = false;
                 } else if (mem.eql(u8, arg, "--high-entropy-va")) {
                     // This option does not do anything.
                 } else if (mem.eql(u8, arg, "--export-all-symbols")) {