embrace the future slightly less
Turns out that even modern Debian aarch64 glibc libc_nonshared.a has references to _init, meaning that the previous commit caused a regression when trying to build any -lc executable on that target. This commit backs out the changes to LibCInstallation. There is still a fork in the road coming up when the self-hosted ELF linker becomes load bearing on that target.
This commit is contained in:
@@ -694,8 +694,10 @@ fn appendCcExe(args: *std.ArrayList([]const u8), skip_cc_env_var: bool) !void {
|
||||
/// `CsuPaths`.
|
||||
pub const CrtBasenames = struct {
|
||||
crt0: ?[]const u8 = null,
|
||||
crti: ?[]const u8 = null,
|
||||
crtbegin: ?[]const u8 = null,
|
||||
crtend: ?[]const u8 = null,
|
||||
crtn: ?[]const u8 = null,
|
||||
|
||||
pub const GetArgs = struct {
|
||||
target: std.Target,
|
||||
@@ -749,96 +751,137 @@ pub const CrtBasenames = struct {
|
||||
|
||||
return switch (target.os.tag) {
|
||||
.linux => switch (mode) {
|
||||
.dynamic_lib => .{},
|
||||
.dynamic_lib => .{
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_exe => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_pie => .{
|
||||
.crt0 = "Scrt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_exe => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_pie => .{
|
||||
.crt0 = "rcrt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
},
|
||||
.dragonfly => switch (mode) {
|
||||
.dynamic_lib => .{
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_exe => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbegin.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_pie => .{
|
||||
.crt0 = "Scrt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_exe => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbegin.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_pie => .{
|
||||
.crt0 = "Scrt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
},
|
||||
.freebsd => switch (mode) {
|
||||
.dynamic_lib => .{
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_exe => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbegin.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_pie => .{
|
||||
.crt0 = "Scrt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_exe => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginT.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_pie => .{
|
||||
.crt0 = "Scrt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
},
|
||||
.netbsd => switch (mode) {
|
||||
.dynamic_lib => .{
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_exe => .{
|
||||
.crt0 = "crt0.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbegin.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_pie => .{
|
||||
.crt0 = "crt0.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_exe => .{
|
||||
.crt0 = "crt0.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginT.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_pie => .{
|
||||
.crt0 = "crt0.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginT.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
},
|
||||
.openbsd => switch (mode) {
|
||||
@@ -859,34 +902,49 @@ pub const CrtBasenames = struct {
|
||||
},
|
||||
.haiku => switch (mode) {
|
||||
.dynamic_lib => .{
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_exe => .{
|
||||
.crt0 = "start_dyn.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbegin.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_pie => .{
|
||||
.crt0 = "start_dyn.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_exe => .{
|
||||
.crt0 = "start_dyn.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbegin.o",
|
||||
.crtend = "crtend.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_pie => .{
|
||||
.crt0 = "start_dyn.o",
|
||||
.crti = "crti.o",
|
||||
.crtbegin = "crtbeginS.o",
|
||||
.crtend = "crtendS.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
},
|
||||
.solaris, .illumos => switch (mode) {
|
||||
.dynamic_lib => .{},
|
||||
.dynamic_lib => .{
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.dynamic_exe, .dynamic_pie => .{
|
||||
.crt0 = "crt1.o",
|
||||
.crti = "crti.o",
|
||||
.crtn = "crtn.o",
|
||||
},
|
||||
.static_exe, .static_pie => .{},
|
||||
},
|
||||
@@ -897,8 +955,10 @@ pub const CrtBasenames = struct {
|
||||
|
||||
pub const CrtPaths = struct {
|
||||
crt0: ?Path = null,
|
||||
crti: ?Path = null,
|
||||
crtbegin: ?Path = null,
|
||||
crtend: ?Path = null,
|
||||
crtn: ?Path = null,
|
||||
};
|
||||
|
||||
pub fn resolveCrtPaths(
|
||||
@@ -920,6 +980,7 @@ pub fn resolveCrtPaths(
|
||||
}) orelse true) "gcc80" else "gcc54";
|
||||
return .{
|
||||
.crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crti = if (crt_basenames.crti) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crtbegin = if (crt_basenames.crtbegin) |basename| .{
|
||||
.root_dir = crt_dir_path.root_dir,
|
||||
.sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),
|
||||
@@ -928,6 +989,7 @@ pub fn resolveCrtPaths(
|
||||
.root_dir = crt_dir_path.root_dir,
|
||||
.sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),
|
||||
} else null,
|
||||
.crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
};
|
||||
},
|
||||
.haiku => {
|
||||
@@ -937,15 +999,19 @@ pub fn resolveCrtPaths(
|
||||
};
|
||||
return .{
|
||||
.crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crti = if (crt_basenames.crti) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crtbegin = if (crt_basenames.crtbegin) |basename| try gcc_dir_path.join(arena, basename) else null,
|
||||
.crtend = if (crt_basenames.crtend) |basename| try gcc_dir_path.join(arena, basename) else null,
|
||||
.crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
};
|
||||
},
|
||||
else => {
|
||||
return .{
|
||||
.crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crti = if (crt_basenames.crti) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crtbegin = if (crt_basenames.crtbegin) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crtend = if (crt_basenames.crtend) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
.crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
|
||||
};
|
||||
},
|
||||
}
|
||||
|
||||
@@ -6743,8 +6743,10 @@ fn getCrtPathsInner(
|
||||
|
||||
return .{
|
||||
.crt0 = if (basenames.crt0) |basename| try crtFilePath(crt_files, basename) else null,
|
||||
.crti = if (basenames.crti) |basename| try crtFilePath(crt_files, basename) else null,
|
||||
.crtbegin = if (basenames.crtbegin) |basename| try crtFilePath(crt_files, basename) else null,
|
||||
.crtend = if (basenames.crtend) |basename| try crtFilePath(crt_files, basename) else null,
|
||||
.crtn = if (basenames.crtn) |basename| try crtFilePath(crt_files, basename) else null,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1869,6 +1869,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
|
||||
// csu prelude
|
||||
const csu = try comp.getCrtPaths(arena);
|
||||
if (csu.crt0) |p| try argv.append(try p.toString(arena));
|
||||
if (csu.crti) |p| try argv.append(try p.toString(arena));
|
||||
if (csu.crtbegin) |p| try argv.append(try p.toString(arena));
|
||||
|
||||
for (self.rpath_table.keys()) |rpath| {
|
||||
@@ -2060,6 +2061,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
|
||||
|
||||
// crt postlude
|
||||
if (csu.crtend) |p| try argv.append(try p.toString(arena));
|
||||
if (csu.crtn) |p| try argv.append(try p.toString(arena));
|
||||
|
||||
if (self.base.allow_shlib_undefined) {
|
||||
try argv.append("--allow-shlib-undefined");
|
||||
|
||||
Reference in New Issue
Block a user