mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
linker: update options references of CsuObjects
This commit is contained in:
parent
b5e2af49a0
commit
98da660e45
@ -85,8 +85,8 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
|
|||||||
man.hash.addListOfBytes(self.base.options.lib_dirs);
|
man.hash.addListOfBytes(self.base.options.lib_dirs);
|
||||||
man.hash.add(self.base.options.skip_linker_dependencies);
|
man.hash.add(self.base.options.skip_linker_dependencies);
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
man.hash.add(self.base.options.libc_installation != null);
|
man.hash.add(self.base.comp.libc_installation != null);
|
||||||
if (self.base.options.libc_installation) |libc_installation| {
|
if (self.base.comp.libc_installation) |libc_installation| {
|
||||||
man.hash.addBytes(libc_installation.crt_dir.?);
|
man.hash.addBytes(libc_installation.crt_dir.?);
|
||||||
if (target.abi == .msvc) {
|
if (target.abi == .msvc) {
|
||||||
man.hash.addBytes(libc_installation.msvc_lib_dir.?);
|
man.hash.addBytes(libc_installation.msvc_lib_dir.?);
|
||||||
@ -244,7 +244,7 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
if (self.base.options.libc_installation) |libc_installation| {
|
if (self.base.comp.libc_installation) |libc_installation| {
|
||||||
try argv.append(try allocPrint(arena, "-LIBPATH:{s}", .{libc_installation.crt_dir.?}));
|
try argv.append(try allocPrint(arena, "-LIBPATH:{s}", .{libc_installation.crt_dir.?}));
|
||||||
|
|
||||||
if (target.abi == .msvc) {
|
if (target.abi == .msvc) {
|
||||||
|
|||||||
@ -1001,7 +1001,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
|||||||
// --verbose-link
|
// --verbose-link
|
||||||
if (self.base.comp.verbose_link) try self.dumpArgv(comp);
|
if (self.base.comp.verbose_link) try self.dumpArgv(comp);
|
||||||
|
|
||||||
const csu = try CsuObjects.init(arena, self.base.options, comp);
|
const csu = try CsuObjects.init(arena, comp);
|
||||||
const compiler_rt_path: ?[]const u8 = blk: {
|
const compiler_rt_path: ?[]const u8 = blk: {
|
||||||
if (comp.compiler_rt_lib) |x| break :blk x.full_object_path;
|
if (comp.compiler_rt_lib) |x| break :blk x.full_object_path;
|
||||||
if (comp.compiler_rt_obj) |x| break :blk x.full_object_path;
|
if (comp.compiler_rt_obj) |x| break :blk x.full_object_path;
|
||||||
@ -1021,8 +1021,8 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
|||||||
if (csu.crti) |v| try positionals.append(.{ .path = v });
|
if (csu.crti) |v| try positionals.append(.{ .path = v });
|
||||||
if (csu.crtbegin) |v| try positionals.append(.{ .path = v });
|
if (csu.crtbegin) |v| try positionals.append(.{ .path = v });
|
||||||
|
|
||||||
try positionals.ensureUnusedCapacity(self.base.options.objects.len);
|
try positionals.ensureUnusedCapacity(self.base.comp.objects.len);
|
||||||
positionals.appendSliceAssumeCapacity(self.base.options.objects);
|
positionals.appendSliceAssumeCapacity(self.base.comp.objects);
|
||||||
|
|
||||||
// This is a set of object files emitted by clang in a single `build-exe` invocation.
|
// This is a set of object files emitted by clang in a single `build-exe` invocation.
|
||||||
// For instance, the implicit `a.o` as compiled by `zig build-exe a.c` will end up
|
// For instance, the implicit `a.o` as compiled by `zig build-exe a.c` will end up
|
||||||
@ -1051,7 +1051,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
|||||||
_ = try rpath_table.put(lib_dir_path, {});
|
_ = try rpath_table.put(lib_dir_path, {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (self.base.options.objects) |obj| {
|
for (self.base.comp.objects) |obj| {
|
||||||
if (Compilation.classifyFileExt(obj.path) == .shared_library) {
|
if (Compilation.classifyFileExt(obj.path) == .shared_library) {
|
||||||
const lib_dir_path = std.fs.path.dirname(obj.path) orelse continue;
|
const lib_dir_path = std.fs.path.dirname(obj.path) orelse continue;
|
||||||
if (obj.loption) continue;
|
if (obj.loption) continue;
|
||||||
@ -1061,7 +1061,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TSAN
|
// TSAN
|
||||||
if (self.base.options.tsan) {
|
if (self.base.comp.config.any_sanitize_thread) {
|
||||||
try positionals.append(.{ .path = comp.tsan_static_lib.?.full_object_path });
|
try positionals.append(.{ .path = comp.tsan_static_lib.?.full_object_path });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1093,21 +1093,21 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
|||||||
}
|
}
|
||||||
|
|
||||||
// libc++ dep
|
// libc++ dep
|
||||||
if (self.base.options.link_libcpp) {
|
if (self.base.comp.config.link_libcpp) {
|
||||||
try system_libs.ensureUnusedCapacity(2);
|
try system_libs.ensureUnusedCapacity(2);
|
||||||
system_libs.appendAssumeCapacity(.{ .path = comp.libcxxabi_static_lib.?.full_object_path });
|
system_libs.appendAssumeCapacity(.{ .path = comp.libcxxabi_static_lib.?.full_object_path });
|
||||||
system_libs.appendAssumeCapacity(.{ .path = comp.libcxx_static_lib.?.full_object_path });
|
system_libs.appendAssumeCapacity(.{ .path = comp.libcxx_static_lib.?.full_object_path });
|
||||||
}
|
}
|
||||||
|
|
||||||
// libunwind dep
|
// libunwind dep
|
||||||
if (self.base.options.link_libunwind) {
|
if (self.base.comp.config.link_libunwind) {
|
||||||
try system_libs.append(.{ .path = comp.libunwind_static_lib.?.full_object_path });
|
try system_libs.append(.{ .path = comp.libunwind_static_lib.?.full_object_path });
|
||||||
}
|
}
|
||||||
|
|
||||||
// libc dep
|
// libc dep
|
||||||
self.error_flags.missing_libc = false;
|
self.error_flags.missing_libc = false;
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.comp.config.link_libc) {
|
||||||
if (self.base.options.libc_installation) |lc| {
|
if (self.base.comp.libc_installation) |lc| {
|
||||||
const flags = target_util.libcFullLinkFlags(target);
|
const flags = target_util.libcFullLinkFlags(target);
|
||||||
try system_libs.ensureUnusedCapacity(flags.len);
|
try system_libs.ensureUnusedCapacity(flags.len);
|
||||||
|
|
||||||
@ -1246,7 +1246,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
|||||||
// Look for entry address in objects if not set by the incremental compiler.
|
// Look for entry address in objects if not set by the incremental compiler.
|
||||||
if (self.entry_index == null) {
|
if (self.entry_index == null) {
|
||||||
const entry: ?[]const u8 = entry: {
|
const entry: ?[]const u8 = entry: {
|
||||||
if (self.base.options.entry) |entry| break :entry entry;
|
if (self.base.comp.config.entry) |entry| break :entry entry;
|
||||||
if (!self.base.isDynLib()) break :entry "_start";
|
if (!self.base.isDynLib()) break :entry "_start";
|
||||||
break :entry null;
|
break :entry null;
|
||||||
};
|
};
|
||||||
@ -1571,7 +1571,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
|
|||||||
}
|
}
|
||||||
} else null;
|
} else null;
|
||||||
|
|
||||||
const csu = try CsuObjects.init(arena, self.base.options, comp);
|
const csu = try CsuObjects.init(arena, comp);
|
||||||
const compiler_rt_path: ?[]const u8 = blk: {
|
const compiler_rt_path: ?[]const u8 = blk: {
|
||||||
if (comp.compiler_rt_lib) |x| break :blk x.full_object_path;
|
if (comp.compiler_rt_lib) |x| break :blk x.full_object_path;
|
||||||
if (comp.compiler_rt_obj) |x| break :blk x.full_object_path;
|
if (comp.compiler_rt_obj) |x| break :blk x.full_object_path;
|
||||||
@ -1713,7 +1713,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
if (self.base.options.libc_installation) |libc_installation| {
|
if (self.base.comp.libc_installation) |libc_installation| {
|
||||||
try argv.append("-L");
|
try argv.append("-L");
|
||||||
try argv.append(libc_installation.crt_dir.?);
|
try argv.append(libc_installation.crt_dir.?);
|
||||||
}
|
}
|
||||||
@ -1803,7 +1803,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
|
|||||||
|
|
||||||
// libc dep
|
// libc dep
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
if (self.base.options.libc_installation != null) {
|
if (self.base.comp.libc_installation != null) {
|
||||||
const needs_grouping = link_mode == .Static;
|
const needs_grouping = link_mode == .Static;
|
||||||
if (needs_grouping) try argv.append("--start-group");
|
if (needs_grouping) try argv.append("--start-group");
|
||||||
try argv.appendSlice(target_util.libcFullLinkFlags(target));
|
try argv.appendSlice(target_util.libcFullLinkFlags(target));
|
||||||
@ -2405,8 +2405,8 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
|
|||||||
man.hash.add(self.base.options.hash_style);
|
man.hash.add(self.base.options.hash_style);
|
||||||
// strip does not need to go into the linker hash because it is part of the hash namespace
|
// strip does not need to go into the linker hash because it is part of the hash namespace
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
man.hash.add(self.base.options.libc_installation != null);
|
man.hash.add(self.base.comp.libc_installation != null);
|
||||||
if (self.base.options.libc_installation) |libc_installation| {
|
if (self.base.comp.libc_installation) |libc_installation| {
|
||||||
man.hash.addBytes(libc_installation.crt_dir.?);
|
man.hash.addBytes(libc_installation.crt_dir.?);
|
||||||
}
|
}
|
||||||
if (have_dynamic_linker) {
|
if (have_dynamic_linker) {
|
||||||
@ -2669,7 +2669,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
|
|||||||
try argv.append(full_out_path);
|
try argv.append(full_out_path);
|
||||||
|
|
||||||
// csu prelude
|
// csu prelude
|
||||||
const csu = try CsuObjects.init(arena, self.base.options, comp);
|
const csu = try CsuObjects.init(arena, comp);
|
||||||
if (csu.crt0) |v| try argv.append(v);
|
if (csu.crt0) |v| try argv.append(v);
|
||||||
if (csu.crti) |v| try argv.append(v);
|
if (csu.crti) |v| try argv.append(v);
|
||||||
if (csu.crtbegin) |v| try argv.append(v);
|
if (csu.crtbegin) |v| try argv.append(v);
|
||||||
@ -2719,7 +2719,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
if (self.base.options.libc_installation) |libc_installation| {
|
if (self.base.comp.libc_installation) |libc_installation| {
|
||||||
try argv.append("-L");
|
try argv.append("-L");
|
||||||
try argv.append(libc_installation.crt_dir.?);
|
try argv.append(libc_installation.crt_dir.?);
|
||||||
}
|
}
|
||||||
@ -2839,7 +2839,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
|
|||||||
// libc dep
|
// libc dep
|
||||||
self.error_flags.missing_libc = false;
|
self.error_flags.missing_libc = false;
|
||||||
if (self.base.options.link_libc) {
|
if (self.base.options.link_libc) {
|
||||||
if (self.base.options.libc_installation != null) {
|
if (self.base.comp.libc_installation != null) {
|
||||||
const needs_grouping = link_mode == .Static;
|
const needs_grouping = link_mode == .Static;
|
||||||
if (needs_grouping) try argv.append("--start-group");
|
if (needs_grouping) try argv.append("--start-group");
|
||||||
try argv.appendSlice(target_util.libcFullLinkFlags(target));
|
try argv.appendSlice(target_util.libcFullLinkFlags(target));
|
||||||
@ -5444,9 +5444,11 @@ const CsuObjects = struct {
|
|||||||
crtend: ?[]const u8 = null,
|
crtend: ?[]const u8 = null,
|
||||||
crtn: ?[]const u8 = null,
|
crtn: ?[]const u8 = null,
|
||||||
|
|
||||||
fn init(arena: mem.Allocator, link_options: link.Options, comp: *const Compilation) !CsuObjects {
|
const InitArgs = struct {};
|
||||||
|
|
||||||
|
fn init(arena: Allocator, comp: *const Compilation) !CsuObjects {
|
||||||
// crt objects are only required for libc.
|
// crt objects are only required for libc.
|
||||||
if (!link_options.link_libc) return CsuObjects{};
|
if (!comp.config.link_libc) return .{};
|
||||||
|
|
||||||
var result: CsuObjects = .{};
|
var result: CsuObjects = .{};
|
||||||
|
|
||||||
@ -5457,19 +5459,21 @@ const CsuObjects = struct {
|
|||||||
dynamic_pie,
|
dynamic_pie,
|
||||||
static_exe,
|
static_exe,
|
||||||
static_pie,
|
static_pie,
|
||||||
} = switch (link_options.output_mode) {
|
} = switch (comp.config.output_mode) {
|
||||||
.Obj => return CsuObjects{},
|
.Obj => return CsuObjects{},
|
||||||
.Lib => switch (link_options.link_mode) {
|
.Lib => switch (comp.config.link_mode) {
|
||||||
.Dynamic => .dynamic_lib,
|
.Dynamic => .dynamic_lib,
|
||||||
.Static => return CsuObjects{},
|
.Static => return CsuObjects{},
|
||||||
},
|
},
|
||||||
.Exe => switch (link_options.link_mode) {
|
.Exe => switch (comp.config.link_mode) {
|
||||||
.Dynamic => if (link_options.pie) .dynamic_pie else .dynamic_exe,
|
.Dynamic => if (comp.config.pie) .dynamic_pie else .dynamic_exe,
|
||||||
.Static => if (link_options.pie) .static_pie else .static_exe,
|
.Static => if (comp.config.pie) .static_pie else .static_exe,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (link_options.target.isAndroid()) {
|
const target = comp.root_mod.resolved_target.result;
|
||||||
|
|
||||||
|
if (target.isAndroid()) {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
// zig fmt: off
|
// zig fmt: off
|
||||||
.dynamic_lib => result.set( null, null, "crtbegin_so.o", "crtend_so.o", null ),
|
.dynamic_lib => result.set( null, null, "crtbegin_so.o", "crtend_so.o", null ),
|
||||||
@ -5480,7 +5484,7 @@ const CsuObjects = struct {
|
|||||||
// zig fmt: on
|
// zig fmt: on
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (link_options.target.os.tag) {
|
switch (target.os.tag) {
|
||||||
.linux => {
|
.linux => {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
// zig fmt: off
|
// zig fmt: off
|
||||||
@ -5491,7 +5495,7 @@ const CsuObjects = struct {
|
|||||||
.static_pie => result.set( "rcrt1.o", "crti.o", "crtbeginS.o", "crtendS.o", "crtn.o" ),
|
.static_pie => result.set( "rcrt1.o", "crti.o", "crtbeginS.o", "crtendS.o", "crtn.o" ),
|
||||||
// zig fmt: on
|
// zig fmt: on
|
||||||
}
|
}
|
||||||
if (link_options.libc_installation) |_| {
|
if (comp.libc_installation) |_| {
|
||||||
// hosted-glibc provides crtbegin/end objects in platform/compiler-specific dirs
|
// hosted-glibc provides crtbegin/end objects in platform/compiler-specific dirs
|
||||||
// and they are not known at comptime. For now null-out crtbegin/end objects;
|
// and they are not known at comptime. For now null-out crtbegin/end objects;
|
||||||
// there is no feature loss, zig has never linked those objects in before.
|
// there is no feature loss, zig has never linked those objects in before.
|
||||||
@ -5499,7 +5503,7 @@ const CsuObjects = struct {
|
|||||||
result.crtend = null;
|
result.crtend = null;
|
||||||
} else {
|
} else {
|
||||||
// Bundled glibc only has Scrt1.o .
|
// Bundled glibc only has Scrt1.o .
|
||||||
if (result.crt0 != null and link_options.target.isGnuLibC()) result.crt0 = "Scrt1.o";
|
if (result.crt0 != null and target.isGnuLibC()) result.crt0 = "Scrt1.o";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.dragonfly => switch (mode) {
|
.dragonfly => switch (mode) {
|
||||||
@ -5561,16 +5565,16 @@ const CsuObjects = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert each object to a full pathname.
|
// Convert each object to a full pathname.
|
||||||
if (link_options.libc_installation) |lci| {
|
if (comp.libc_installation) |lci| {
|
||||||
const crt_dir_path = lci.crt_dir orelse return error.LibCInstallationMissingCRTDir;
|
const crt_dir_path = lci.crt_dir orelse return error.LibCInstallationMissingCRTDir;
|
||||||
switch (link_options.target.os.tag) {
|
switch (target.os.tag) {
|
||||||
.dragonfly => {
|
.dragonfly => {
|
||||||
if (result.crt0) |*obj| obj.* = try fs.path.join(arena, &[_][]const u8{ crt_dir_path, obj.* });
|
if (result.crt0) |*obj| obj.* = try fs.path.join(arena, &[_][]const u8{ crt_dir_path, obj.* });
|
||||||
if (result.crti) |*obj| obj.* = try fs.path.join(arena, &[_][]const u8{ crt_dir_path, obj.* });
|
if (result.crti) |*obj| obj.* = try fs.path.join(arena, &[_][]const u8{ crt_dir_path, obj.* });
|
||||||
if (result.crtn) |*obj| obj.* = try fs.path.join(arena, &[_][]const u8{ crt_dir_path, obj.* });
|
if (result.crtn) |*obj| obj.* = try fs.path.join(arena, &[_][]const u8{ crt_dir_path, obj.* });
|
||||||
|
|
||||||
var gccv: []const u8 = undefined;
|
var gccv: []const u8 = undefined;
|
||||||
if (link_options.target.os.version_range.semver.isAtLeast(.{ .major = 5, .minor = 4, .patch = 0 }) orelse true) {
|
if (target.os.version_range.semver.isAtLeast(.{ .major = 5, .minor = 4, .patch = 0 }) orelse true) {
|
||||||
gccv = "gcc80";
|
gccv = "gcc80";
|
||||||
} else {
|
} else {
|
||||||
gccv = "gcc54";
|
gccv = "gcc54";
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user