Skip to content

Commit 874e17f

Browse files
committed
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.
1 parent f5485a5 commit 874e17f

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

lib/std/zig/LibCInstallation.zig

+68-2
Original file line numberDiff line numberDiff line change
@@ -694,8 +694,10 @@ fn appendCcExe(args: *std.ArrayList([]const u8), skip_cc_env_var: bool) !void {
694694
/// `CsuPaths`.
695695
pub const CrtBasenames = struct {
696696
crt0: ?[]const u8 = null,
697+
crti: ?[]const u8 = null,
697698
crtbegin: ?[]const u8 = null,
698699
crtend: ?[]const u8 = null,
700+
crtn: ?[]const u8 = null,
699701

700702
pub const GetArgs = struct {
701703
target: std.Target,
@@ -749,96 +751,137 @@ pub const CrtBasenames = struct {
749751

750752
return switch (target.os.tag) {
751753
.linux => switch (mode) {
752-
.dynamic_lib => .{},
754+
.dynamic_lib => .{
755+
.crti = "crti.o",
756+
.crtn = "crtn.o",
757+
},
753758
.dynamic_exe => .{
754759
.crt0 = "crt1.o",
760+
.crti = "crti.o",
761+
.crtn = "crtn.o",
755762
},
756763
.dynamic_pie => .{
757764
.crt0 = "Scrt1.o",
765+
.crti = "crti.o",
766+
.crtn = "crtn.o",
758767
},
759768
.static_exe => .{
760769
.crt0 = "crt1.o",
770+
.crti = "crti.o",
771+
.crtn = "crtn.o",
761772
},
762773
.static_pie => .{
763774
.crt0 = "rcrt1.o",
775+
.crti = "crti.o",
776+
.crtn = "crtn.o",
764777
},
765778
},
766779
.dragonfly => switch (mode) {
767780
.dynamic_lib => .{
781+
.crti = "crti.o",
768782
.crtbegin = "crtbeginS.o",
769783
.crtend = "crtendS.o",
784+
.crtn = "crtn.o",
770785
},
771786
.dynamic_exe => .{
772787
.crt0 = "crt1.o",
788+
.crti = "crti.o",
773789
.crtbegin = "crtbegin.o",
774790
.crtend = "crtend.o",
791+
.crtn = "crtn.o",
775792
},
776793
.dynamic_pie => .{
777794
.crt0 = "Scrt1.o",
795+
.crti = "crti.o",
778796
.crtbegin = "crtbeginS.o",
779797
.crtend = "crtendS.o",
798+
.crtn = "crtn.o",
780799
},
781800
.static_exe => .{
782801
.crt0 = "crt1.o",
802+
.crti = "crti.o",
783803
.crtbegin = "crtbegin.o",
784804
.crtend = "crtend.o",
805+
.crtn = "crtn.o",
785806
},
786807
.static_pie => .{
787808
.crt0 = "Scrt1.o",
809+
.crti = "crti.o",
788810
.crtbegin = "crtbeginS.o",
789811
.crtend = "crtendS.o",
812+
.crtn = "crtn.o",
790813
},
791814
},
792815
.freebsd => switch (mode) {
793816
.dynamic_lib => .{
817+
.crti = "crti.o",
794818
.crtbegin = "crtbeginS.o",
795819
.crtend = "crtendS.o",
820+
.crtn = "crtn.o",
796821
},
797822
.dynamic_exe => .{
798823
.crt0 = "crt1.o",
824+
.crti = "crti.o",
799825
.crtbegin = "crtbegin.o",
800826
.crtend = "crtend.o",
827+
.crtn = "crtn.o",
801828
},
802829
.dynamic_pie => .{
803830
.crt0 = "Scrt1.o",
831+
.crti = "crti.o",
804832
.crtbegin = "crtbeginS.o",
805833
.crtend = "crtendS.o",
834+
.crtn = "crtn.o",
806835
},
807836
.static_exe => .{
808837
.crt0 = "crt1.o",
838+
.crti = "crti.o",
809839
.crtbegin = "crtbeginT.o",
810840
.crtend = "crtend.o",
841+
.crtn = "crtn.o",
811842
},
812843
.static_pie => .{
813844
.crt0 = "Scrt1.o",
845+
.crti = "crti.o",
814846
.crtbegin = "crtbeginS.o",
815847
.crtend = "crtendS.o",
848+
.crtn = "crtn.o",
816849
},
817850
},
818851
.netbsd => switch (mode) {
819852
.dynamic_lib => .{
853+
.crti = "crti.o",
820854
.crtbegin = "crtbeginS.o",
821855
.crtend = "crtendS.o",
856+
.crtn = "crtn.o",
822857
},
823858
.dynamic_exe => .{
824859
.crt0 = "crt0.o",
860+
.crti = "crti.o",
825861
.crtbegin = "crtbegin.o",
826862
.crtend = "crtend.o",
863+
.crtn = "crtn.o",
827864
},
828865
.dynamic_pie => .{
829866
.crt0 = "crt0.o",
867+
.crti = "crti.o",
830868
.crtbegin = "crtbeginS.o",
831869
.crtend = "crtendS.o",
870+
.crtn = "crtn.o",
832871
},
833872
.static_exe => .{
834873
.crt0 = "crt0.o",
874+
.crti = "crti.o",
835875
.crtbegin = "crtbeginT.o",
836876
.crtend = "crtend.o",
877+
.crtn = "crtn.o",
837878
},
838879
.static_pie => .{
839880
.crt0 = "crt0.o",
881+
.crti = "crti.o",
840882
.crtbegin = "crtbeginT.o",
841883
.crtend = "crtendS.o",
884+
.crtn = "crtn.o",
842885
},
843886
},
844887
.openbsd => switch (mode) {
@@ -859,34 +902,49 @@ pub const CrtBasenames = struct {
859902
},
860903
.haiku => switch (mode) {
861904
.dynamic_lib => .{
905+
.crti = "crti.o",
862906
.crtbegin = "crtbeginS.o",
863907
.crtend = "crtendS.o",
908+
.crtn = "crtn.o",
864909
},
865910
.dynamic_exe => .{
866911
.crt0 = "start_dyn.o",
912+
.crti = "crti.o",
867913
.crtbegin = "crtbegin.o",
868914
.crtend = "crtend.o",
915+
.crtn = "crtn.o",
869916
},
870917
.dynamic_pie => .{
871918
.crt0 = "start_dyn.o",
919+
.crti = "crti.o",
872920
.crtbegin = "crtbeginS.o",
873921
.crtend = "crtendS.o",
922+
.crtn = "crtn.o",
874923
},
875924
.static_exe => .{
876925
.crt0 = "start_dyn.o",
926+
.crti = "crti.o",
877927
.crtbegin = "crtbegin.o",
878928
.crtend = "crtend.o",
929+
.crtn = "crtn.o",
879930
},
880931
.static_pie => .{
881932
.crt0 = "start_dyn.o",
933+
.crti = "crti.o",
882934
.crtbegin = "crtbeginS.o",
883935
.crtend = "crtendS.o",
936+
.crtn = "crtn.o",
884937
},
885938
},
886939
.solaris, .illumos => switch (mode) {
887-
.dynamic_lib => .{},
940+
.dynamic_lib => .{
941+
.crti = "crti.o",
942+
.crtn = "crtn.o",
943+
},
888944
.dynamic_exe, .dynamic_pie => .{
889945
.crt0 = "crt1.o",
946+
.crti = "crti.o",
947+
.crtn = "crtn.o",
890948
},
891949
.static_exe, .static_pie => .{},
892950
},
@@ -897,8 +955,10 @@ pub const CrtBasenames = struct {
897955

898956
pub const CrtPaths = struct {
899957
crt0: ?Path = null,
958+
crti: ?Path = null,
900959
crtbegin: ?Path = null,
901960
crtend: ?Path = null,
961+
crtn: ?Path = null,
902962
};
903963

904964
pub fn resolveCrtPaths(
@@ -920,6 +980,7 @@ pub fn resolveCrtPaths(
920980
}) orelse true) "gcc80" else "gcc54";
921981
return .{
922982
.crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,
983+
.crti = if (crt_basenames.crti) |basename| try crt_dir_path.join(arena, basename) else null,
923984
.crtbegin = if (crt_basenames.crtbegin) |basename| .{
924985
.root_dir = crt_dir_path.root_dir,
925986
.sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),
@@ -928,6 +989,7 @@ pub fn resolveCrtPaths(
928989
.root_dir = crt_dir_path.root_dir,
929990
.sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),
930991
} else null,
992+
.crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
931993
};
932994
},
933995
.haiku => {
@@ -937,15 +999,19 @@ pub fn resolveCrtPaths(
937999
};
9381000
return .{
9391001
.crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,
1002+
.crti = if (crt_basenames.crti) |basename| try crt_dir_path.join(arena, basename) else null,
9401003
.crtbegin = if (crt_basenames.crtbegin) |basename| try gcc_dir_path.join(arena, basename) else null,
9411004
.crtend = if (crt_basenames.crtend) |basename| try gcc_dir_path.join(arena, basename) else null,
1005+
.crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
9421006
};
9431007
},
9441008
else => {
9451009
return .{
9461010
.crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,
1011+
.crti = if (crt_basenames.crti) |basename| try crt_dir_path.join(arena, basename) else null,
9471012
.crtbegin = if (crt_basenames.crtbegin) |basename| try crt_dir_path.join(arena, basename) else null,
9481013
.crtend = if (crt_basenames.crtend) |basename| try crt_dir_path.join(arena, basename) else null,
1014+
.crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
9491015
};
9501016
},
9511017
}

src/Compilation.zig

+2
Original file line numberDiff line numberDiff line change
@@ -6743,8 +6743,10 @@ fn getCrtPathsInner(
67436743

67446744
return .{
67456745
.crt0 = if (basenames.crt0) |basename| try crtFilePath(crt_files, basename) else null,
6746+
.crti = if (basenames.crti) |basename| try crtFilePath(crt_files, basename) else null,
67466747
.crtbegin = if (basenames.crtbegin) |basename| try crtFilePath(crt_files, basename) else null,
67476748
.crtend = if (basenames.crtend) |basename| try crtFilePath(crt_files, basename) else null,
6749+
.crtn = if (basenames.crtn) |basename| try crtFilePath(crt_files, basename) else null,
67486750
};
67496751
}
67506752

src/link/Elf.zig

+2
Original file line numberDiff line numberDiff line change
@@ -1869,6 +1869,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
18691869
// csu prelude
18701870
const csu = try comp.getCrtPaths(arena);
18711871
if (csu.crt0) |p| try argv.append(try p.toString(arena));
1872+
if (csu.crti) |p| try argv.append(try p.toString(arena));
18721873
if (csu.crtbegin) |p| try argv.append(try p.toString(arena));
18731874

18741875
for (self.rpath_table.keys()) |rpath| {
@@ -2060,6 +2061,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
20602061

20612062
// crt postlude
20622063
if (csu.crtend) |p| try argv.append(try p.toString(arena));
2064+
if (csu.crtn) |p| try argv.append(try p.toString(arena));
20632065

20642066
if (self.base.allow_shlib_undefined) {
20652067
try argv.append("--allow-shlib-undefined");

0 commit comments

Comments
 (0)