aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/Atom.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-11-08 11:51:11 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-11-08 11:51:11 +0100
commitae08f9bfe9c2ab5488b375ffd949609016658450 (patch)
tree697a3d39739a2704c538965c6ebcb462f1ea597f /src/link/Elf/Atom.zig
parente87c751558ec1b81bab09f40959a58d250a35a41 (diff)
downloadzig-ae08f9bfe9c2ab5488b375ffd949609016658450.tar.gz
zig-ae08f9bfe9c2ab5488b375ffd949609016658450.zip
elf: claim unresolved dangling symbols as undef externs in -r mode
Diffstat (limited to 'src/link/Elf/Atom.zig')
-rw-r--r--src/link/Elf/Atom.zig20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig
index 95202a3d4c..09a16e4240 100644
--- a/src/link/Elf/Atom.zig
+++ b/src/link/Elf/Atom.zig
@@ -294,6 +294,8 @@ pub fn relocs(self: Atom, elf_file: *Elf) []align(1) const elf.Elf64_Rela {
}
pub fn writeRelocs(self: Atom, elf_file: *Elf, out_relocs: *std.ArrayList(elf.Elf64_Rela)) !void {
+ relocs_log.debug("0x{x}: {s}", .{ self.value, self.name(elf_file) });
+
const file_ptr = self.file(elf_file).?;
for (self.relocs(elf_file)) |rel| {
const target_index = switch (file_ptr) {
@@ -302,15 +304,27 @@ pub fn writeRelocs(self: Atom, elf_file: *Elf, out_relocs: *std.ArrayList(elf.El
else => unreachable,
};
const target = elf_file.symbol(target_index);
- const r_sym = target.outputSymtabIndex(elf_file);
- const r_offset = self.value + rel.r_offset;
- const r_addend = rel.r_addend;
const r_type = switch (rel.r_type()) {
Elf.R_X86_64_ZIG_GOT32,
Elf.R_X86_64_ZIG_GOTPCREL,
=> unreachable, // Sanity check if we accidentally emitted those.
else => |r_type| r_type,
};
+ const r_offset = self.value + rel.r_offset;
+ const r_addend = rel.r_addend;
+ const r_sym = switch (target.type(elf_file)) {
+ elf.STT_SECTION => elf_file.sectionSymbolOutputSymtabIndex(target.outputShndx().?),
+ else => target.outputSymtabIndex(elf_file),
+ };
+
+ relocs_log.debug(" {s}: [{x} => {d}({s})] + {x}", .{
+ fmtRelocType(r_type),
+ r_offset,
+ r_sym,
+ target.name(elf_file),
+ r_addend,
+ });
+
out_relocs.appendAssumeCapacity(.{
.r_offset = r_offset,
.r_addend = r_addend,