-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Closed
Labels
enhancementSolving this issue will likely involve adding new logic or components to the codebase.Solving this issue will likely involve adding new logic or components to the codebase.linkingos-macos
Milestone
Description
This is a sub-task of #8726.
LLD on Mach-O is fatally flawed for a few reasons. One example is #3295.
However Zig still falls back to LLD for Mach-O in a handful of cases. Here is the current logic:
Lines 714 to 751 in 2d11967
// Make a decision on whether to use LLD or our own linker. | |
const use_lld = if (options.use_lld) |explicit| explicit else blk: { | |
if (!build_options.have_llvm) | |
break :blk false; | |
if (ofmt == .c) | |
break :blk false; | |
if (options.want_lto) |lto| { | |
if (lto) { | |
break :blk true; | |
} | |
} | |
// Our linker can't handle objects or most advanced options yet. | |
if (options.link_objects.len != 0 or | |
options.c_source_files.len != 0 or | |
options.frameworks.len != 0 or | |
options.system_libs.len != 0 or | |
options.link_libc or options.link_libcpp or | |
options.link_eh_frame_hdr or | |
options.link_emit_relocs or | |
options.output_mode == .Lib or | |
options.lld_argv.len != 0 or | |
options.image_base_override != null or | |
options.linker_script != null or options.version_script != null) | |
{ | |
break :blk true; | |
} | |
if (use_llvm) { | |
// If stage1 generates an object file, self-hosted linker is not | |
// yet sophisticated enough to handle that. | |
break :blk options.root_pkg != null; | |
} | |
break :blk false; | |
}; |
Lines 637 to 656 in 2d11967
const use_zld = blk: { | |
if (self.base.options.is_native_os and self.base.options.system_linker_hack) { | |
// If the user forces the use of ld64, make sure we are running native! | |
break :blk false; | |
} | |
if (self.base.options.target.cpu.arch == .aarch64) { | |
// On aarch64, always use zld. | |
break :blk true; | |
} | |
if (self.base.options.output_mode == .Lib or | |
self.base.options.linker_script != null) | |
{ | |
// Fallback to LLD in this handful of cases on x86_64 only. | |
break :blk false; | |
} | |
break :blk true; | |
}; |
This issue is to improve self-hosted linking on Mach-O enough that for Mach-O targets, we always use self-hosted linking, and we can remove this line from cmake:
Line 45 in 2d11967
FIND_AND_ADD_LLD_LIB(lldMachO) |
jedisct1, komuw, kivutar and slavakurilyakkubkon and jedisct1kubkon, jedisct1 and komuwkubkon, jedisct1 and komuwkubkon and jedisct1
Metadata
Metadata
Assignees
Labels
enhancementSolving this issue will likely involve adding new logic or components to the codebase.Solving this issue will likely involve adding new logic or components to the codebase.linkingos-macos