ziglang / zig

General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
https://ziglang.org
MIT License
34.81k stars 2.54k forks source link

eliminate dependency on LLD for COFF/PE #17751

Open andrewrk opened 1 year ago

andrewrk commented 1 year ago

Related:

Put simply, this issue can be closed when the following diff is applied:

--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -899,15 +899,13 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {

         // Make a decision on whether to use LLD or our own linker.
         const use_lld = options.use_lld orelse blk: {
-            if (options.target.isDarwin()) {
-                break :blk false;
-            }
-
             if (!build_options.have_llvm)
                 break :blk false;

-            if (options.target.ofmt == .c)
-                break :blk false;
+            switch (options.target.ofmt) {
+                .c, .macho, .coff => break :blk false,
+                else => {},
+            }

             if (options.want_lto) |lto| {
                 if (lto) {
squeek502 commented 1 year ago

For resources, some preliminary investigation makes me think that we will want something similar to cvtres.exe to convert a .res file into a COFF object file, which is the actual thing that gets linked (here's the source for llvm-cvtres which AFAICT is responsible for this functionality in LLVM). I think this is something that would probably make the most sense to have in resinator (and outputting COFF object files is also something that windres supports, so there's precedence for this in alternative resource compilers).

I believe this would mean that the self-hosted linker would only need to care about normal COFF object files, with no special casing for .res files.

Relevant PE format docs: https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#the-rsrc-section

I've made a resinator issue here: https://github.com/squeek502/resinator/issues/7