authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-13 13:00:00+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-10-13 13:00:00+02:00
log7185ccad14068729cc805214aebd3bac62e99c73
tree20191ded416a4fcaa4696b0449cfef58022354d1
parente131a2c8e20de13256954cbb38ca3502cdfca07b
parent87b1f14015f12ab6cf7ad694d5318bf28138ff6c
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21686 from alexrp/glibc-fixes

`glibc`: Emit some fill data for stub symbols, thus giving each a unique address.

1 files changed, 25 insertions(+), 7 deletions(-)

src/glibc.zig+25-7
......@@ -935,10 +935,11 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
935935 var ver_buf_i: u8 = 0;
936936 while (ver_buf_i < versions_len) : (ver_buf_i += 1) {
937937 // Example:
938 // .balign 4
938939 // .globl _Exit_2_2_5
939940 // .type _Exit_2_2_5, %function;
940941 // .symver _Exit_2_2_5, _Exit@@GLIBC_2.2.5
941 // _Exit_2_2_5:
942 // _Exit_2_2_5: .long 0
942943 const ver_index = versions_buffer[ver_buf_i];
943944 const ver = metadata.all_versions[ver_index];
944945
......@@ -957,12 +958,14 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
957958 .{ sym_name, ver.major, ver.minor },
958959 );
959960 try stubs_asm.writer().print(
961 \\.balign {d}
960962 \\.globl {s}
961963 \\.type {s}, %function;
962964 \\.symver {s}, {s}{s}GLIBC_{d}.{d}
963 \\{s}:
965 \\{s}: {s} 0
964966 \\
965967 , .{
968 target.ptrBitWidth() / 8,
966969 sym_plus_ver,
967970 sym_plus_ver,
968971 sym_plus_ver,
......@@ -971,6 +974,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
971974 ver.major,
972975 ver.minor,
973976 sym_plus_ver,
977 wordDirective(target),
974978 });
975979 } else {
976980 const sym_plus_ver = if (want_default)
......@@ -982,12 +986,14 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
982986 .{ sym_name, ver.major, ver.minor, ver.patch },
983987 );
984988 try stubs_asm.writer().print(
989 \\.balign {d}
985990 \\.globl {s}
986991 \\.type {s}, %function;
987992 \\.symver {s}, {s}{s}GLIBC_{d}.{d}.{d}
988 \\{s}:
993 \\{s}: {s} 0
989994 \\
990995 , .{
996 target.ptrBitWidth() / 8,
991997 sym_plus_ver,
992998 sym_plus_ver,
993999 sym_plus_ver,
......@@ -997,6 +1003,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
9971003 ver.minor,
9981004 ver.patch,
9991005 sym_plus_ver,
1006 wordDirective(target),
10001007 });
10011008 }
10021009 }
......@@ -1024,10 +1031,14 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
10241031 // a strong reference.
10251032 if (std.mem.eql(u8, lib.name, "c")) {
10261033 try stubs_asm.writer().print(
1034 \\.balign {d}
10271035 \\.globl _IO_stdin_used
10281036 \\{s} _IO_stdin_used
10291037 \\
1030 , .{wordDirective(target)});
1038 , .{
1039 target.ptrBitWidth() / 8,
1040 wordDirective(target),
1041 });
10311042 }
10321043
10331044 const obj_inclusions_len = try inc_reader.readInt(u16, .little);
......@@ -1099,11 +1110,12 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
10991110 var ver_buf_i: u8 = 0;
11001111 while (ver_buf_i < versions_len) : (ver_buf_i += 1) {
11011112 // Example:
1113 // .balign 4
11021114 // .globl environ_2_2_5
11031115 // .type environ_2_2_5, %object;
11041116 // .size environ_2_2_5, 4;
11051117 // .symver environ_2_2_5, environ@@GLIBC_2.2.5
1106 // environ_2_2_5:
1118 // environ_2_2_5: .fill 4, 1, 0
11071119 const ver_index = versions_buffer[ver_buf_i];
11081120 const ver = metadata.all_versions[ver_index];
11091121
......@@ -1122,13 +1134,15 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
11221134 .{ sym_name, ver.major, ver.minor },
11231135 );
11241136 try stubs_asm.writer().print(
1137 \\.balign {d}
11251138 \\.globl {s}
11261139 \\.type {s}, %object;
11271140 \\.size {s}, {d};
11281141 \\.symver {s}, {s}{s}GLIBC_{d}.{d}
1129 \\{s}:
1142 \\{s}: .fill {d}, 1, 0
11301143 \\
11311144 , .{
1145 target.ptrBitWidth() / 8,
11321146 sym_plus_ver,
11331147 sym_plus_ver,
11341148 sym_plus_ver,
......@@ -1139,6 +1153,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
11391153 ver.major,
11401154 ver.minor,
11411155 sym_plus_ver,
1156 size,
11421157 });
11431158 } else {
11441159 const sym_plus_ver = if (want_default)
......@@ -1150,13 +1165,15 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
11501165 .{ sym_name, ver.major, ver.minor, ver.patch },
11511166 );
11521167 try stubs_asm.writer().print(
1168 \\.balign {d}
11531169 \\.globl {s}
11541170 \\.type {s}, %object;
11551171 \\.size {s}, {d};
11561172 \\.symver {s}, {s}{s}GLIBC_{d}.{d}.{d}
1157 \\{s}:
1173 \\{s}: .fill {d}, 1, 0
11581174 \\
11591175 , .{
1176 target.ptrBitWidth() / 8,
11601177 sym_plus_ver,
11611178 sym_plus_ver,
11621179 sym_plus_ver,
......@@ -1168,6 +1185,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi
11681185 ver.minor,
11691186 ver.patch,
11701187 sym_plus_ver,
1188 size,
11711189 });
11721190 }
11731191 }