elf: do not store Symbol's index in Symbol
This commit is contained in:
@@ -4316,7 +4316,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
||||
if (self.bin_file.cast(link.File.Elf)) |elf_file| {
|
||||
const sym_index = try elf_file.getOrCreateMetadataForDecl(func.owner_decl);
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
const got_addr = @as(u32, @intCast(sym.gotAddress(elf_file)));
|
||||
try self.genSetReg(Type.usize, .x30, .{ .memory = got_addr });
|
||||
} else if (self.bin_file.cast(link.File.MachO)) |macho_file| {
|
||||
|
||||
@@ -4296,7 +4296,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
||||
if (self.bin_file.cast(link.File.Elf)) |elf_file| {
|
||||
const sym_index = try elf_file.getOrCreateMetadataForDecl(func.owner_decl);
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
const got_addr = @as(u32, @intCast(sym.gotAddress(elf_file)));
|
||||
try self.genSetReg(Type.usize, .lr, .{ .memory = got_addr });
|
||||
} else if (self.bin_file.cast(link.File.MachO)) |_| {
|
||||
|
||||
@@ -1749,7 +1749,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
||||
.func => |func| {
|
||||
const sym_index = try elf_file.getOrCreateMetadataForDecl(func.owner_decl);
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
const got_addr = @as(u32, @intCast(sym.gotAddress(elf_file)));
|
||||
try self.genSetReg(Type.usize, .ra, .{ .memory = got_addr });
|
||||
_ = try self.addInst(.{
|
||||
|
||||
@@ -1351,7 +1351,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
||||
const got_addr = if (self.bin_file.cast(link.File.Elf)) |elf_file| blk: {
|
||||
const sym_index = try elf_file.getOrCreateMetadataForDecl(func.owner_decl);
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
break :blk @as(u32, @intCast(sym.gotAddress(elf_file)));
|
||||
} else unreachable;
|
||||
|
||||
|
||||
@@ -8157,7 +8157,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
|
||||
const sym_index = try elf_file.getOrCreateMetadataForDecl(owner_decl);
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
sym.flags.needs_got = true;
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
const got_addr = sym.gotAddress(elf_file);
|
||||
try self.asmMemory(.{ ._, .call }, Memory.sib(.qword, .{
|
||||
.base = .{ .reg = .ds },
|
||||
@@ -10236,7 +10236,7 @@ fn genLazySymbolRef(
|
||||
return self.fail("{s} creating lazy symbol", .{@errorName(err)});
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
sym.flags.needs_got = true;
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
const got_addr = sym.gotAddress(elf_file);
|
||||
const got_mem =
|
||||
Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = @intCast(got_addr) });
|
||||
|
||||
@@ -861,7 +861,7 @@ fn genDeclRef(
|
||||
const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
sym.flags.needs_got = true;
|
||||
_ = try sym.getOrCreateGotEntry(elf_file);
|
||||
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
|
||||
return GenResult.mcv(.{ .memory = sym.gotAddress(elf_file) });
|
||||
} else if (bin_file.cast(link.File.MachO)) |macho_file| {
|
||||
const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index);
|
||||
|
||||
@@ -1082,9 +1082,10 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
||||
if (comp.compiler_rt_obj) |x| break :blk x.full_object_path;
|
||||
break :blk null;
|
||||
};
|
||||
if (compiler_rt_path) |path| {
|
||||
try positionals.append(.{ .path = path });
|
||||
}
|
||||
_ = compiler_rt_path;
|
||||
// if (compiler_rt_path) |path| {
|
||||
// try positionals.append(.{ .path = path });
|
||||
// }
|
||||
|
||||
for (positionals.items) |obj| {
|
||||
const in_file = try std.fs.cwd().openFile(obj.path, .{});
|
||||
@@ -1643,11 +1644,11 @@ fn scanRelocs(self: *Elf) !void {
|
||||
|
||||
try self.reportUndefined(&undefs);
|
||||
|
||||
for (self.symbols.items) |*sym| {
|
||||
for (self.symbols.items, 0..) |*sym, sym_index| {
|
||||
if (sym.flags.needs_got) {
|
||||
log.debug("'{s}' needs GOT", .{sym.name(self)});
|
||||
// TODO how can we tell we need to write it again, aka the entry is dirty?
|
||||
const gop = try sym.getOrCreateGotEntry(self);
|
||||
const gop = try sym.getOrCreateGotEntry(@intCast(sym_index), self);
|
||||
try self.got.writeEntry(self, gop.index);
|
||||
}
|
||||
}
|
||||
@@ -2695,7 +2696,7 @@ fn updateDeclCode(
|
||||
esym.st_value = atom_ptr.value;
|
||||
|
||||
sym.flags.needs_got = true;
|
||||
const gop = try sym.getOrCreateGotEntry(self);
|
||||
const gop = try sym.getOrCreateGotEntry(sym_index, self);
|
||||
try self.got.writeEntry(self, gop.index);
|
||||
}
|
||||
|
||||
@@ -2930,7 +2931,7 @@ fn updateLazySymbol(self: *Elf, sym: link.File.LazySymbol, symbol_index: Symbol.
|
||||
local_esym.st_value = atom_ptr.value;
|
||||
|
||||
local_sym.flags.needs_got = true;
|
||||
const gop = try local_sym.getOrCreateGotEntry(self);
|
||||
const gop = try local_sym.getOrCreateGotEntry(symbol_index, self);
|
||||
try self.got.writeEntry(self, gop.index);
|
||||
|
||||
const section_offset = atom_ptr.value - self.phdrs.items[phdr_index].p_vaddr;
|
||||
@@ -3801,7 +3802,7 @@ pub fn addSymbol(self: *Elf) !Symbol.Index {
|
||||
break :blk index;
|
||||
}
|
||||
};
|
||||
self.symbols.items[index] = .{ .index = index };
|
||||
self.symbols.items[index] = .{};
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
@@ -322,11 +322,12 @@ pub fn scanRelocs(self: Atom, elf_file: *Elf, undefs: anytype) !void {
|
||||
|
||||
if (rel.r_type() == elf.R_X86_64_NONE) continue;
|
||||
|
||||
const symbol = switch (file_ptr) {
|
||||
.zig_module => |x| elf_file.symbol(x.symbol(rel.r_sym())),
|
||||
.object => |x| elf_file.symbol(x.symbols.items[rel.r_sym()]),
|
||||
const symbol_index = switch (file_ptr) {
|
||||
.zig_module => |x| x.symbol(rel.r_sym()),
|
||||
.object => |x| x.symbols.items[rel.r_sym()],
|
||||
else => unreachable,
|
||||
};
|
||||
const symbol = elf_file.symbol(symbol_index);
|
||||
|
||||
// Check for violation of One Definition Rule for COMDATs.
|
||||
if (symbol.file(elf_file) == null) {
|
||||
@@ -340,7 +341,7 @@ pub fn scanRelocs(self: Atom, elf_file: *Elf, undefs: anytype) !void {
|
||||
}
|
||||
|
||||
// Report an undefined symbol.
|
||||
try self.reportUndefined(elf_file, symbol, rel, undefs);
|
||||
try self.reportUndefined(elf_file, symbol, symbol_index, rel, undefs);
|
||||
|
||||
// While traversing relocations, mark symbols that require special handling such as
|
||||
// pointer indirection via GOT, or a stub trampoline via PLT.
|
||||
@@ -379,7 +380,14 @@ pub fn scanRelocs(self: Atom, elf_file: *Elf, undefs: anytype) !void {
|
||||
}
|
||||
|
||||
// This function will report any undefined non-weak symbols that are not imports.
|
||||
fn reportUndefined(self: Atom, elf_file: *Elf, sym: *const Symbol, rel: elf.Elf64_Rela, undefs: anytype) !void {
|
||||
fn reportUndefined(
|
||||
self: Atom,
|
||||
elf_file: *Elf,
|
||||
sym: *const Symbol,
|
||||
sym_index: Symbol.Index,
|
||||
rel: elf.Elf64_Rela,
|
||||
undefs: anytype,
|
||||
) !void {
|
||||
const rel_esym = switch (elf_file.file(self.file_index).?) {
|
||||
.zig_module => |x| x.elfSym(rel.r_sym()).*,
|
||||
.object => |x| x.symtab[rel.r_sym()],
|
||||
@@ -392,7 +400,7 @@ fn reportUndefined(self: Atom, elf_file: *Elf, sym: *const Symbol, rel: elf.Elf6
|
||||
!sym.flags.import and
|
||||
esym.st_shndx == elf.SHN_UNDEF)
|
||||
{
|
||||
const gop = try undefs.getOrPut(sym.index);
|
||||
const gop = try undefs.getOrPut(sym_index);
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = std.ArrayList(Atom.Index).init(elf_file.base.allocator);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
//! Represents a defined symbol.
|
||||
|
||||
index: Index = 0,
|
||||
|
||||
/// Allocated address value of this symbol.
|
||||
value: u64 = 0,
|
||||
|
||||
@@ -117,10 +115,10 @@ const GetOrCreateGotEntryResult = struct {
|
||||
index: GotSection.Index,
|
||||
};
|
||||
|
||||
pub fn getOrCreateGotEntry(symbol: *Symbol, elf_file: *Elf) !GetOrCreateGotEntryResult {
|
||||
pub fn getOrCreateGotEntry(symbol: *Symbol, symbol_index: Index, elf_file: *Elf) !GetOrCreateGotEntryResult {
|
||||
assert(symbol.flags.needs_got);
|
||||
if (symbol.flags.has_got) return .{ .found_existing = true, .index = symbol.extra(elf_file).?.got };
|
||||
const index = try elf_file.got.addGotSymbol(symbol.index, elf_file);
|
||||
const index = try elf_file.got.addGotSymbol(symbol_index, elf_file);
|
||||
symbol.flags.has_got = true;
|
||||
return .{ .found_existing = false, .index = index };
|
||||
}
|
||||
@@ -270,7 +268,7 @@ fn format2(
|
||||
_ = options;
|
||||
_ = unused_fmt_string;
|
||||
const symbol = ctx.symbol;
|
||||
try writer.print("%{d} : {s} : @{x}", .{ symbol.index, symbol.fmtName(ctx.elf_file), symbol.value });
|
||||
try writer.print("%{d} : {s} : @{x}", .{ symbol.esym_index, symbol.fmtName(ctx.elf_file), symbol.value });
|
||||
if (symbol.file(ctx.elf_file)) |file_ptr| {
|
||||
if (symbol.isAbs(ctx.elf_file)) {
|
||||
if (symbol.elfSym(ctx.elf_file).st_shndx == elf.SHN_UNDEF) {
|
||||
|
||||
Reference in New Issue
Block a user