authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-20 20:06:25-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-20 20:59:52-08:00
log874e17fe608a7b8d4324dada32664fcfe44978cd
treee1eda8b298b892eca8b75a9deb3acad52c01f481
parentf5485a52bcd7495fb2be234695b4cea809f60581

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.

3 files changed, 72 insertions(+), 2 deletions(-)

lib/std/zig/LibCInstallation.zig+68-2
......@@ -694,8 +694,10 @@ fn appendCcExe(args: *std.ArrayList([]const u8), skip_cc_env_var: bool) !void {
694694/// `CsuPaths`.
695695pub 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
898956pub 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
904964pub 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
......@@ -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
......@@ -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");