authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-11-10 02:26:02-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-11-11 01:47:27-05:00
log79a9f3a4180dfe395c816b86a2afc79edc302e65
tree30c2e85005c886d946973c9b42ff1a148a021be7
parent8647e4d3110dd269f6c377ecd8315a19e094758a

Elf2: fix relocations against untyped symbols


1 files changed, 20 insertions(+), 21 deletions(-)

src/link/Elf2.zig+20-21
......@@ -1444,15 +1444,9 @@ pub fn symtabSlice(elf: *Elf) SymtabSlice {
14441444 const slice = elf.si.symtab.node(elf).slice(&elf.mf);
14451445 return switch (elf.identClass()) {
14461446 .NONE, _ => unreachable,
1447 inline else => |class| @unionInit(
1448 SymtabSlice,
1449 @tagName(class),
1450 @ptrCast(@alignCast(slice[0..std.mem.alignBackwardAnyAlign(
1451 usize,
1452 slice.len,
1453 @sizeOf(class.ElfN().Sym),
1454 )])),
1455 ),
1447 inline else => |class| @unionInit(SymtabSlice, @tagName(class), @ptrCast(@alignCast(
1448 slice[0..std.mem.alignBackwardAnyAlign(usize, slice.len, @sizeOf(class.ElfN().Sym))],
1449 ))),
14561450 };
14571451}
14581452
......@@ -1471,11 +1465,9 @@ pub fn dynsymSlice(elf: *Elf) SymtabSlice {
14711465 const slice = elf.si.dynsym.node(elf).slice(&elf.mf);
14721466 return switch (elf.identClass()) {
14731467 .NONE, _ => unreachable,
1474 inline else => |class| @unionInit(
1475 SymtabSlice,
1476 @tagName(class),
1477 @ptrCast(@alignCast(slice)),
1478 ),
1468 inline else => |class| @unionInit(SymtabSlice, @tagName(class), @ptrCast(@alignCast(
1469 slice[0..std.mem.alignBackwardAnyAlign(usize, slice.len, @sizeOf(class.ElfN().Sym))],
1470 ))),
14791471 };
14801472}
14811473
......@@ -1853,7 +1845,7 @@ fn loadObject(
18531845 break :strtab strtab;
18541846 };
18551847 defer gpa.free(strtab);
1856 const symnum = std.math.divExact(
1848 const symnum = std.math.sub(u32, std.math.divExact(
18571849 u32,
18581850 @intCast(symtab.shdr.size),
18591851 @intCast(symtab.shdr.entsize),
......@@ -1861,9 +1853,9 @@ fn loadObject(
18611853 path,
18621854 "symtab section size (0x{x}) is not a multiple of entsize (0x{x})",
18631855 .{ symtab.shdr.size, symtab.shdr.entsize },
1864 );
1856 ), 1) catch continue;
18651857 symmap.clearRetainingCapacity();
1866 try symmap.resize(gpa, std.math.sub(u32, symnum, 1) catch continue);
1858 try symmap.resize(gpa, symnum);
18671859 try elf.symtab.ensureUnusedCapacity(gpa, symnum);
18681860 try elf.globals.ensureUnusedCapacity(gpa, symnum);
18691861 try fr.seekTo(fl.offset + symtab.shdr.offset + symtab.shdr.entsize);
......@@ -1874,13 +1866,13 @@ fn loadObject(
18741866 if (input_sym.name >= strtab.len or input_sym.shndx == std.elf.SHN_UNDEF or
18751867 input_sym.shndx >= ehdr.shnum) continue;
18761868 switch (input_sym.info.type) {
1877 else => continue,
1869 .NOTYPE, .OBJECT, .FUNC => {},
18781870 .SECTION => {
18791871 const section = &sections[input_sym.shndx];
18801872 if (input_sym.value == section.shdr.addr) si.* = section.si;
18811873 continue;
18821874 },
1883 .OBJECT, .FUNC => {},
1875 else => continue,
18841876 }
18851877 const name = std.mem.sliceTo(strtab[input_sym.name..], 0);
18861878 const parent_si = sections[input_sym.shndx].si;
......@@ -1935,8 +1927,13 @@ fn loadObject(
19351927 };
19361928 if (rels.shdr.entsize < @sizeOf(Rel))
19371929 return diags.failParse(path, "unsupported rel entsize", .{});
1930
19381931 const loc_sec = &sections[rels.shdr.info];
19391932 if (loc_sec.si == .null) continue;
1933 const loc_sym = loc_sec.si.get(elf);
1934 assert(loc_sym.loc_relocs == .none);
1935 loc_sym.loc_relocs = @enumFromInt(elf.relocs.items.len);
1936
19401937 const relnum = std.math.divExact(
19411938 u32,
19421939 @intCast(rels.shdr.size),
......@@ -1951,7 +1948,7 @@ fn loadObject(
19511948 for (0..relnum) |_| {
19521949 const rel = try r.peekStruct(Rel, target_endian);
19531950 try r.discardAll64(rels.shdr.entsize);
1954 if (rel.info.sym >= symnum) continue;
1951 if (rel.info.sym == 0 or rel.info.sym > symnum) continue;
19551952 const target_si = symmap.items[rel.info.sym - 1];
19561953 if (target_si == .null) continue;
19571954 elf.addRelocAssumeCapacity(
......@@ -2854,10 +2851,12 @@ fn flushInputSection(elf: *Elf, isi: Node.InputSectionIndex) !void {
28542851 var fr = file.reader(comp.io, &.{});
28552852 try fr.seekTo(file_loc.offset);
28562853 var nw: MappedFile.Node.Writer = undefined;
2857 isi.symbol(elf).node(elf).writer(&elf.mf, gpa, &nw);
2854 const si = isi.symbol(elf);
2855 si.node(elf).writer(&elf.mf, gpa, &nw);
28582856 defer nw.deinit();
28592857 if (try nw.interface.sendFileAll(&fr, .limited(@intCast(file_loc.size))) != file_loc.size)
28602858 return error.EndOfStream;
2859 si.applyLocationRelocs(elf);
28612860}
28622861
28632862fn flushFileOffset(elf: *Elf, ni: MappedFile.Node.Index) !void {