aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-08-15 10:21:20 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-08-15 10:21:20 +0200
commit0fd0b11bc43a6053c68f649e1e1a1e23b995a266 (patch)
tree2826a6066d838f456b3cc537aa199e9f11e9a8fe /src/link
parent8a0cb7002e6b8f7b50fdf7ee40311ce93fbef009 (diff)
downloadzig-0fd0b11bc43a6053c68f649e1e1a1e23b995a266.tar.gz
zig-0fd0b11bc43a6053c68f649e1e1a1e23b995a266.zip
riscv: do not emit GOT relocations for special linker symbols
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Elf.zig27
-rw-r--r--src/link/Elf/Atom.zig25
-rw-r--r--src/link/Elf/relocation.zig14
3 files changed, 7 insertions, 59 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 3dcfb0bc6a..0ef1e9862d 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -5934,33 +5934,6 @@ const RelaSection = struct {
};
const RelaSectionTable = std.AutoArrayHashMapUnmanaged(u32, RelaSection);
-pub const R_GOT_HI20_STATIC: u32 = 0xff04;
-pub const R_GOT_LO12_I_STATIC: u32 = 0xff05;
-
-// Comptime asserts that no Zig relocs overlap with another ISA's reloc number
-comptime {
- const zig_relocs = .{
- R_GOT_HI20_STATIC,
- R_GOT_LO12_I_STATIC,
- };
-
- const other_relocs = .{
- elf.R_X86_64,
- elf.R_AARCH64,
- elf.R_RISCV,
- elf.R_PPC64,
- };
-
- @setEvalBranchQuota(@min(other_relocs.len * zig_relocs.len * 256, 6200));
- for (other_relocs) |relocs| {
- for (@typeInfo(relocs).Enum.fields) |reloc| {
- for (zig_relocs) |zig_reloc| {
- assert(reloc.value != zig_reloc);
- }
- }
- }
-}
-
fn defaultEntrySymbolName(cpu_arch: std.Target.Cpu.Arch) []const u8 {
return switch (cpu_arch) {
.mips, .mipsel, .mips64, .mips64el => "__start",
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig
index 47bb216080..c214b07914 100644
--- a/src/link/Elf/Atom.zig
+++ b/src/link/Elf/Atom.zig
@@ -1978,13 +1978,7 @@ const riscv = struct {
.SUB32,
=> {},
- else => |x| switch (@intFromEnum(x)) {
- Elf.R_GOT_HI20_STATIC,
- Elf.R_GOT_LO12_I_STATIC,
- => symbol.flags.needs_got = true,
-
- else => try atom.reportUnhandledRelocError(rel, elf_file),
- },
+ else => try atom.reportUnhandledRelocError(rel, elf_file),
}
}
@@ -2121,22 +2115,7 @@ const riscv = struct {
// TODO: annotates an ADD instruction that can be removed when TPREL is relaxed
},
- else => |x| switch (@intFromEnum(x)) {
- // Zig custom relocations
- Elf.R_GOT_HI20_STATIC => {
- assert(target.flags.has_got);
- const disp: u32 = @bitCast(math.cast(i32, G + GOT + A) orelse return error.Overflow);
- riscv_util.writeInstU(code[r_offset..][0..4], disp);
- },
-
- Elf.R_GOT_LO12_I_STATIC => {
- assert(target.flags.has_got);
- const disp: u32 = @bitCast(math.cast(i32, G + GOT + A) orelse return error.Overflow);
- riscv_util.writeInstI(code[r_offset..][0..4], disp);
- },
-
- else => try atom.reportUnhandledRelocError(rel, elf_file),
- },
+ else => try atom.reportUnhandledRelocError(rel, elf_file),
}
}
diff --git a/src/link/Elf/relocation.zig b/src/link/Elf/relocation.zig
index 887aece8bc..e1a317f67d 100644
--- a/src/link/Elf/relocation.zig
+++ b/src/link/Elf/relocation.zig
@@ -112,15 +112,11 @@ fn formatRelocType(
_ = unused_fmt_string;
_ = options;
const r_type = ctx.r_type;
- switch (r_type) {
- Elf.R_GOT_HI20_STATIC => try writer.writeAll("R_GOT_HI20_STATIC"),
- Elf.R_GOT_LO12_I_STATIC => try writer.writeAll("R_GOT_LO12_I_STATIC"),
- else => switch (ctx.cpu_arch) {
- .x86_64 => try writer.print("R_X86_64_{s}", .{@tagName(@as(elf.R_X86_64, @enumFromInt(r_type)))}),
- .aarch64 => try writer.print("R_AARCH64_{s}", .{@tagName(@as(elf.R_AARCH64, @enumFromInt(r_type)))}),
- .riscv64 => try writer.print("R_RISCV_{s}", .{@tagName(@as(elf.R_RISCV, @enumFromInt(r_type)))}),
- else => unreachable,
- },
+ switch (ctx.cpu_arch) {
+ .x86_64 => try writer.print("R_X86_64_{s}", .{@tagName(@as(elf.R_X86_64, @enumFromInt(r_type)))}),
+ .aarch64 => try writer.print("R_AARCH64_{s}", .{@tagName(@as(elf.R_AARCH64, @enumFromInt(r_type)))}),
+ .riscv64 => try writer.print("R_RISCV_{s}", .{@tagName(@as(elf.R_RISCV, @enumFromInt(r_type)))}),
+ else => unreachable,
}
}