diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-01-20 20:06:25 -0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-01-20 20:59:52 -0800 |
| commit | 874e17fe608a7b8d4324dada32664fcfe44978cd (patch) | |
| tree | e1eda8b298b892eca8b75a9deb3acad52c01f481 /lib | |
| parent | f5485a52bcd7495fb2be234695b4cea809f60581 (diff) | |
| download | zig-874e17fe608a7b8d4324dada32664fcfe44978cd.tar.gz zig-874e17fe608a7b8d4324dada32664fcfe44978cd.zip | |
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.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/zig/LibCInstallation.zig | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/lib/std/zig/LibCInstallation.zig b/lib/std/zig/LibCInstallation.zig index 8a7c6a15e1..56bc388f5d 100644 --- a/lib/std/zig/LibCInstallation.zig +++ b/lib/std/zig/LibCInstallation.zig @@ -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, }; }, } |
