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 {...@@ -694,8 +694,10 @@ fn appendCcExe(args: *std.ArrayList([]const u8), skip_cc_env_var: bool) !void {
694/// `CsuPaths`.694/// `CsuPaths`.
695pub const CrtBasenames = struct {695pub const CrtBasenames = struct {
696 crt0: ?[]const u8 = null,696 crt0: ?[]const u8 = null,
697 crti: ?[]const u8 = null,
697 crtbegin: ?[]const u8 = null,698 crtbegin: ?[]const u8 = null,
698 crtend: ?[]const u8 = null,699 crtend: ?[]const u8 = null,
700 crtn: ?[]const u8 = null,
699701
700 pub const GetArgs = struct {702 pub const GetArgs = struct {
701 target: std.Target,703 target: std.Target,
...@@ -749,96 +751,137 @@ pub const CrtBasenames = struct {...@@ -749,96 +751,137 @@ pub const CrtBasenames = struct {
749751
750 return switch (target.os.tag) {752 return switch (target.os.tag) {
751 .linux => switch (mode) {753 .linux => switch (mode) {
752 .dynamic_lib => .{},754 .dynamic_lib => .{
755 .crti = "crti.o",
756 .crtn = "crtn.o",
757 },
753 .dynamic_exe => .{758 .dynamic_exe => .{
754 .crt0 = "crt1.o",759 .crt0 = "crt1.o",
760 .crti = "crti.o",
761 .crtn = "crtn.o",
755 },762 },
756 .dynamic_pie => .{763 .dynamic_pie => .{
757 .crt0 = "Scrt1.o",764 .crt0 = "Scrt1.o",
765 .crti = "crti.o",
766 .crtn = "crtn.o",
758 },767 },
759 .static_exe => .{768 .static_exe => .{
760 .crt0 = "crt1.o",769 .crt0 = "crt1.o",
770 .crti = "crti.o",
771 .crtn = "crtn.o",
761 },772 },
762 .static_pie => .{773 .static_pie => .{
763 .crt0 = "rcrt1.o",774 .crt0 = "rcrt1.o",
775 .crti = "crti.o",
776 .crtn = "crtn.o",
764 },777 },
765 },778 },
766 .dragonfly => switch (mode) {779 .dragonfly => switch (mode) {
767 .dynamic_lib => .{780 .dynamic_lib => .{
781 .crti = "crti.o",
768 .crtbegin = "crtbeginS.o",782 .crtbegin = "crtbeginS.o",
769 .crtend = "crtendS.o",783 .crtend = "crtendS.o",
784 .crtn = "crtn.o",
770 },785 },
771 .dynamic_exe => .{786 .dynamic_exe => .{
772 .crt0 = "crt1.o",787 .crt0 = "crt1.o",
788 .crti = "crti.o",
773 .crtbegin = "crtbegin.o",789 .crtbegin = "crtbegin.o",
774 .crtend = "crtend.o",790 .crtend = "crtend.o",
791 .crtn = "crtn.o",
775 },792 },
776 .dynamic_pie => .{793 .dynamic_pie => .{
777 .crt0 = "Scrt1.o",794 .crt0 = "Scrt1.o",
795 .crti = "crti.o",
778 .crtbegin = "crtbeginS.o",796 .crtbegin = "crtbeginS.o",
779 .crtend = "crtendS.o",797 .crtend = "crtendS.o",
798 .crtn = "crtn.o",
780 },799 },
781 .static_exe => .{800 .static_exe => .{
782 .crt0 = "crt1.o",801 .crt0 = "crt1.o",
802 .crti = "crti.o",
783 .crtbegin = "crtbegin.o",803 .crtbegin = "crtbegin.o",
784 .crtend = "crtend.o",804 .crtend = "crtend.o",
805 .crtn = "crtn.o",
785 },806 },
786 .static_pie => .{807 .static_pie => .{
787 .crt0 = "Scrt1.o",808 .crt0 = "Scrt1.o",
809 .crti = "crti.o",
788 .crtbegin = "crtbeginS.o",810 .crtbegin = "crtbeginS.o",
789 .crtend = "crtendS.o",811 .crtend = "crtendS.o",
812 .crtn = "crtn.o",
790 },813 },
791 },814 },
792 .freebsd => switch (mode) {815 .freebsd => switch (mode) {
793 .dynamic_lib => .{816 .dynamic_lib => .{
817 .crti = "crti.o",
794 .crtbegin = "crtbeginS.o",818 .crtbegin = "crtbeginS.o",
795 .crtend = "crtendS.o",819 .crtend = "crtendS.o",
820 .crtn = "crtn.o",
796 },821 },
797 .dynamic_exe => .{822 .dynamic_exe => .{
798 .crt0 = "crt1.o",823 .crt0 = "crt1.o",
824 .crti = "crti.o",
799 .crtbegin = "crtbegin.o",825 .crtbegin = "crtbegin.o",
800 .crtend = "crtend.o",826 .crtend = "crtend.o",
827 .crtn = "crtn.o",
801 },828 },
802 .dynamic_pie => .{829 .dynamic_pie => .{
803 .crt0 = "Scrt1.o",830 .crt0 = "Scrt1.o",
831 .crti = "crti.o",
804 .crtbegin = "crtbeginS.o",832 .crtbegin = "crtbeginS.o",
805 .crtend = "crtendS.o",833 .crtend = "crtendS.o",
834 .crtn = "crtn.o",
806 },835 },
807 .static_exe => .{836 .static_exe => .{
808 .crt0 = "crt1.o",837 .crt0 = "crt1.o",
838 .crti = "crti.o",
809 .crtbegin = "crtbeginT.o",839 .crtbegin = "crtbeginT.o",
810 .crtend = "crtend.o",840 .crtend = "crtend.o",
841 .crtn = "crtn.o",
811 },842 },
812 .static_pie => .{843 .static_pie => .{
813 .crt0 = "Scrt1.o",844 .crt0 = "Scrt1.o",
845 .crti = "crti.o",
814 .crtbegin = "crtbeginS.o",846 .crtbegin = "crtbeginS.o",
815 .crtend = "crtendS.o",847 .crtend = "crtendS.o",
848 .crtn = "crtn.o",
816 },849 },
817 },850 },
818 .netbsd => switch (mode) {851 .netbsd => switch (mode) {
819 .dynamic_lib => .{852 .dynamic_lib => .{
853 .crti = "crti.o",
820 .crtbegin = "crtbeginS.o",854 .crtbegin = "crtbeginS.o",
821 .crtend = "crtendS.o",855 .crtend = "crtendS.o",
856 .crtn = "crtn.o",
822 },857 },
823 .dynamic_exe => .{858 .dynamic_exe => .{
824 .crt0 = "crt0.o",859 .crt0 = "crt0.o",
860 .crti = "crti.o",
825 .crtbegin = "crtbegin.o",861 .crtbegin = "crtbegin.o",
826 .crtend = "crtend.o",862 .crtend = "crtend.o",
863 .crtn = "crtn.o",
827 },864 },
828 .dynamic_pie => .{865 .dynamic_pie => .{
829 .crt0 = "crt0.o",866 .crt0 = "crt0.o",
867 .crti = "crti.o",
830 .crtbegin = "crtbeginS.o",868 .crtbegin = "crtbeginS.o",
831 .crtend = "crtendS.o",869 .crtend = "crtendS.o",
870 .crtn = "crtn.o",
832 },871 },
833 .static_exe => .{872 .static_exe => .{
834 .crt0 = "crt0.o",873 .crt0 = "crt0.o",
874 .crti = "crti.o",
835 .crtbegin = "crtbeginT.o",875 .crtbegin = "crtbeginT.o",
836 .crtend = "crtend.o",876 .crtend = "crtend.o",
877 .crtn = "crtn.o",
837 },878 },
838 .static_pie => .{879 .static_pie => .{
839 .crt0 = "crt0.o",880 .crt0 = "crt0.o",
881 .crti = "crti.o",
840 .crtbegin = "crtbeginT.o",882 .crtbegin = "crtbeginT.o",
841 .crtend = "crtendS.o",883 .crtend = "crtendS.o",
884 .crtn = "crtn.o",
842 },885 },
843 },886 },
844 .openbsd => switch (mode) {887 .openbsd => switch (mode) {
...@@ -859,34 +902,49 @@ pub const CrtBasenames = struct {...@@ -859,34 +902,49 @@ pub const CrtBasenames = struct {
859 },902 },
860 .haiku => switch (mode) {903 .haiku => switch (mode) {
861 .dynamic_lib => .{904 .dynamic_lib => .{
905 .crti = "crti.o",
862 .crtbegin = "crtbeginS.o",906 .crtbegin = "crtbeginS.o",
863 .crtend = "crtendS.o",907 .crtend = "crtendS.o",
908 .crtn = "crtn.o",
864 },909 },
865 .dynamic_exe => .{910 .dynamic_exe => .{
866 .crt0 = "start_dyn.o",911 .crt0 = "start_dyn.o",
912 .crti = "crti.o",
867 .crtbegin = "crtbegin.o",913 .crtbegin = "crtbegin.o",
868 .crtend = "crtend.o",914 .crtend = "crtend.o",
915 .crtn = "crtn.o",
869 },916 },
870 .dynamic_pie => .{917 .dynamic_pie => .{
871 .crt0 = "start_dyn.o",918 .crt0 = "start_dyn.o",
919 .crti = "crti.o",
872 .crtbegin = "crtbeginS.o",920 .crtbegin = "crtbeginS.o",
873 .crtend = "crtendS.o",921 .crtend = "crtendS.o",
922 .crtn = "crtn.o",
874 },923 },
875 .static_exe => .{924 .static_exe => .{
876 .crt0 = "start_dyn.o",925 .crt0 = "start_dyn.o",
926 .crti = "crti.o",
877 .crtbegin = "crtbegin.o",927 .crtbegin = "crtbegin.o",
878 .crtend = "crtend.o",928 .crtend = "crtend.o",
929 .crtn = "crtn.o",
879 },930 },
880 .static_pie => .{931 .static_pie => .{
881 .crt0 = "start_dyn.o",932 .crt0 = "start_dyn.o",
933 .crti = "crti.o",
882 .crtbegin = "crtbeginS.o",934 .crtbegin = "crtbeginS.o",
883 .crtend = "crtendS.o",935 .crtend = "crtendS.o",
936 .crtn = "crtn.o",
884 },937 },
885 },938 },
886 .solaris, .illumos => switch (mode) {939 .solaris, .illumos => switch (mode) {
887 .dynamic_lib => .{},940 .dynamic_lib => .{
941 .crti = "crti.o",
942 .crtn = "crtn.o",
943 },
888 .dynamic_exe, .dynamic_pie => .{944 .dynamic_exe, .dynamic_pie => .{
889 .crt0 = "crt1.o",945 .crt0 = "crt1.o",
946 .crti = "crti.o",
947 .crtn = "crtn.o",
890 },948 },
891 .static_exe, .static_pie => .{},949 .static_exe, .static_pie => .{},
892 },950 },
...@@ -897,8 +955,10 @@ pub const CrtBasenames = struct {...@@ -897,8 +955,10 @@ pub const CrtBasenames = struct {
897955
898pub const CrtPaths = struct {956pub const CrtPaths = struct {
899 crt0: ?Path = null,957 crt0: ?Path = null,
958 crti: ?Path = null,
900 crtbegin: ?Path = null,959 crtbegin: ?Path = null,
901 crtend: ?Path = null,960 crtend: ?Path = null,
961 crtn: ?Path = null,
902};962};
903963
904pub fn resolveCrtPaths(964pub fn resolveCrtPaths(
...@@ -920,6 +980,7 @@ pub fn resolveCrtPaths(...@@ -920,6 +980,7 @@ pub fn resolveCrtPaths(
920 }) orelse true) "gcc80" else "gcc54";980 }) orelse true) "gcc80" else "gcc54";
921 return .{981 return .{
922 .crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,982 .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,
923 .crtbegin = if (crt_basenames.crtbegin) |basename| .{984 .crtbegin = if (crt_basenames.crtbegin) |basename| .{
924 .root_dir = crt_dir_path.root_dir,985 .root_dir = crt_dir_path.root_dir,
925 .sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),986 .sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),
...@@ -928,6 +989,7 @@ pub fn resolveCrtPaths(...@@ -928,6 +989,7 @@ pub fn resolveCrtPaths(
928 .root_dir = crt_dir_path.root_dir,989 .root_dir = crt_dir_path.root_dir,
929 .sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),990 .sub_path = try fs.path.join(arena, &.{ crt_dir_path.sub_path, gccv, basename }),
930 } else null,991 } else null,
992 .crtn = if (crt_basenames.crtn) |basename| try crt_dir_path.join(arena, basename) else null,
931 };993 };
932 },994 },
933 .haiku => {995 .haiku => {
...@@ -937,15 +999,19 @@ pub fn resolveCrtPaths(...@@ -937,15 +999,19 @@ pub fn resolveCrtPaths(
937 };999 };
938 return .{1000 return .{
939 .crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,1001 .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,
940 .crtbegin = if (crt_basenames.crtbegin) |basename| try gcc_dir_path.join(arena, basename) else null,1003 .crtbegin = if (crt_basenames.crtbegin) |basename| try gcc_dir_path.join(arena, basename) else null,
941 .crtend = if (crt_basenames.crtend) |basename| try gcc_dir_path.join(arena, basename) else null,1004 .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,
942 };1006 };
943 },1007 },
944 else => {1008 else => {
945 return .{1009 return .{
946 .crt0 = if (crt_basenames.crt0) |basename| try crt_dir_path.join(arena, basename) else null,1010 .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,
947 .crtbegin = if (crt_basenames.crtbegin) |basename| try crt_dir_path.join(arena, basename) else null,1012 .crtbegin = if (crt_basenames.crtbegin) |basename| try crt_dir_path.join(arena, basename) else null,
948 .crtend = if (crt_basenames.crtend) |basename| try crt_dir_path.join(arena, basename) else null,1013 .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,
949 };1015 };
950 },1016 },
951 }1017 }
src/Compilation.zig+2
...@@ -6743,8 +6743,10 @@ fn getCrtPathsInner(...@@ -6743,8 +6743,10 @@ fn getCrtPathsInner(
67436743
6744 return .{6744 return .{
6745 .crt0 = if (basenames.crt0) |basename| try crtFilePath(crt_files, basename) else null,6745 .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,
6746 .crtbegin = if (basenames.crtbegin) |basename| try crtFilePath(crt_files, basename) else null,6747 .crtbegin = if (basenames.crtbegin) |basename| try crtFilePath(crt_files, basename) else null,
6747 .crtend = if (basenames.crtend) |basename| try crtFilePath(crt_files, basename) else null,6748 .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,
6748 };6750 };
6749}6751}
67506752
src/link/Elf.zig+2
...@@ -1869,6 +1869,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s...@@ -1869,6 +1869,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
1869 // csu prelude1869 // csu prelude
1870 const csu = try comp.getCrtPaths(arena);1870 const csu = try comp.getCrtPaths(arena);
1871 if (csu.crt0) |p| try argv.append(try p.toString(arena));1871 if (csu.crt0) |p| try argv.append(try p.toString(arena));
1872 if (csu.crti) |p| try argv.append(try p.toString(arena));
1872 if (csu.crtbegin) |p| try argv.append(try p.toString(arena));1873 if (csu.crtbegin) |p| try argv.append(try p.toString(arena));
18731874
1874 for (self.rpath_table.keys()) |rpath| {1875 for (self.rpath_table.keys()) |rpath| {
...@@ -2060,6 +2061,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s...@@ -2060,6 +2061,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
20602061
2061 // crt postlude2062 // crt postlude
2062 if (csu.crtend) |p| try argv.append(try p.toString(arena));2063 if (csu.crtend) |p| try argv.append(try p.toString(arena));
2064 if (csu.crtn) |p| try argv.append(try p.toString(arena));
20632065
2064 if (self.base.allow_shlib_undefined) {2066 if (self.base.allow_shlib_undefined) {
2065 try argv.append("--allow-shlib-undefined");2067 try argv.append("--allow-shlib-undefined");