aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-09-28 14:06:12 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-09-28 14:06:12 +0200
commitaf00ac53b50ca9dc606560f106ef17c488e71249 (patch)
tree9dd7a1745d4aacede1f97bea02b6fe573a1c079f /src
parenta63ce5a37c9655f4f453d848285b85fb91625390 (diff)
downloadzig-af00ac53b50ca9dc606560f106ef17c488e71249.tar.gz
zig-af00ac53b50ca9dc606560f106ef17c488e71249.zip
elf: report fatal linker error for unhandled relocation types
Diffstat (limited to 'src')
-rw-r--r--src/link/Elf.zig2
-rw-r--r--src/link/Elf/Atom.zig17
-rw-r--r--src/link/Elf/Object.zig5
3 files changed, 15 insertions, 9 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 8979932f61..148da9f1cb 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -4098,7 +4098,7 @@ const ErrorWithNotes = struct {
}
};
-fn addErrorWithNotes(self: *Elf, note_count: usize) error{OutOfMemory}!ErrorWithNotes {
+pub fn addErrorWithNotes(self: *Elf, note_count: usize) error{OutOfMemory}!ErrorWithNotes {
try self.misc_errors.ensureUnusedCapacity(self.base.allocator, 1);
return self.addErrorWithNotesAssumeCapacity(note_count);
}
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig
index d044ef40a2..3dd19c3f11 100644
--- a/src/link/Elf/Atom.zig
+++ b/src/link/Elf/Atom.zig
@@ -388,7 +388,17 @@ pub fn scanRelocs(self: Atom, elf_file: *Elf, undefs: anytype) !void {
elf.R_X86_64_PC32 => {},
- else => @panic("TODO"),
+ else => {
+ var err = try elf_file.addErrorWithNotes(1);
+ try err.addMsg(elf_file, "fatal linker error: unhandled relocation type {}", .{
+ fmtRelocType(rel.r_type()),
+ });
+ try err.addNote(elf_file, "in {}:{s} at offset 0x{x}", .{
+ self.file(elf_file).?.fmtPath(),
+ self.name(elf_file),
+ rel.r_offset,
+ });
+ },
}
}
}
@@ -512,10 +522,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
try cwriter.writeIntLittle(i32, @as(i32, @intCast(G + GOT + A - P)));
},
- else => {
- log.err("TODO: unhandled relocation type {}", .{fmtRelocType(rel.r_type())});
- @panic("TODO unhandled relocation type");
- },
+ else => {},
}
}
}
diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig
index fe14831d1a..9126190ed4 100644
--- a/src/link/Elf/Object.zig
+++ b/src/link/Elf/Object.zig
@@ -233,8 +233,7 @@ fn getOutputSectionIndex(self: *Object, elf_file: *Elf, shdr: elf.Elf64_Shdr) er
const is_alloc = flags & elf.SHF_ALLOC != 0;
const is_write = flags & elf.SHF_WRITE != 0;
const is_exec = flags & elf.SHF_EXECINSTR != 0;
- const is_tls = flags & elf.SHF_TLS != 0;
- if (!is_alloc or is_tls) {
+ if (!is_alloc) {
log.err("{}: output section {s} not found", .{ self.fmtPath(), name });
@panic("TODO: missing output section!");
}
@@ -243,7 +242,7 @@ fn getOutputSectionIndex(self: *Object, elf_file: *Elf, shdr: elf.Elf64_Shdr) er
if (is_exec) phdr_flags |= elf.PF_X;
const phdr_index = try elf_file.allocateSegment(.{
.size = Elf.padToIdeal(shdr.sh_size),
- .alignment = if (is_tls) shdr.sh_addralign else elf_file.page_size,
+ .alignment = elf_file.page_size,
.flags = phdr_flags,
});
const shndx = try elf_file.allocateAllocSection(.{