authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-18 17:42:22+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:41+01:00
log82e92fe5f605a0ef8fa53e8434458bf18deadb5f
tree31c606cffbf33f542c4365a572fe4675fcabb75e
parentee463efdf2e662fb4970aa6e9ba43d165e0cdfc7

macho: fill the rest of ZigObject


2 files changed, 45 insertions(+), 10 deletions(-)

src/link/MachO/Atom.zig+9
...@@ -383,6 +383,15 @@ pub fn free(self: *Atom, macho_file: *MachO) void {...@@ -383,6 +383,15 @@ pub fn free(self: *Atom, macho_file: *MachO) void {
383 self.* = .{};383 self.* = .{};
384}384}
385385
386pub fn addReloc(self: *Atom, macho_file: *MachO, reloc: Relocation) !void {
387 const gpa = macho_file.base.comp.gpa;
388 const file = self.getFile(macho_file);
389 assert(file == .zig_object);
390 const rels = &file.zig_object.relocs.items[self.relocs.pos];
391 try rels.append(gpa, reloc);
392 self.relocs.len += 1;
393}
394
386pub fn freeRelocs(self: *Atom, macho_file: *MachO) void {395pub fn freeRelocs(self: *Atom, macho_file: *MachO) void {
387 self.getFile(macho_file).zig_object.freeAtomRelocs(self.*);396 self.getFile(macho_file).zig_object.freeAtomRelocs(self.*);
388 self.relocs.len = 0;397 self.relocs.len = 0;
src/link/MachO/ZigObject.zig+36-10
...@@ -234,11 +234,24 @@ pub fn getDeclVAddr(...@@ -234,11 +234,24 @@ pub fn getDeclVAddr(
234 decl_index: InternPool.DeclIndex,234 decl_index: InternPool.DeclIndex,
235 reloc_info: link.File.RelocInfo,235 reloc_info: link.File.RelocInfo,
236) !u64 {236) !u64 {
237 _ = self;237 const sym_index = try self.getOrCreateMetadataForDecl(macho_file, decl_index);
238 _ = macho_file;238 const sym = macho_file.getSymbol(sym_index);
239 _ = decl_index;239 const vaddr = sym.getAddress(.{}, macho_file);
240 _ = reloc_info;240 const parent_atom = macho_file.getSymbol(reloc_info.parent_atom_index).getAtom(macho_file).?;
241 @panic("TODO getDeclVAddr");241 try parent_atom.addReloc(macho_file, .{
242 .tag = .@"extern",
243 .offset = @intCast(reloc_info.offset),
244 .target = sym.nlist_idx,
245 .addend = reloc_info.addend,
246 .type = .unsigned,
247 .meta = .{
248 .pcrel = false,
249 .has_subtractor = false,
250 .length = 3,
251 .symbolnum = @intCast(sym.nlist_idx),
252 },
253 });
254 return vaddr;
242}255}
243256
244pub fn getAnonDeclVAddr(257pub fn getAnonDeclVAddr(
...@@ -247,11 +260,24 @@ pub fn getAnonDeclVAddr(...@@ -247,11 +260,24 @@ pub fn getAnonDeclVAddr(
247 decl_val: InternPool.Index,260 decl_val: InternPool.Index,
248 reloc_info: link.File.RelocInfo,261 reloc_info: link.File.RelocInfo,
249) !u64 {262) !u64 {
250 _ = self;263 const sym_index = self.anon_decls.get(decl_val).?.symbol_index;
251 _ = macho_file;264 const sym = macho_file.getSymbol(sym_index);
252 _ = decl_val;265 const vaddr = sym.getAddress(.{}, macho_file);
253 _ = reloc_info;266 const parent_atom = macho_file.getSymbol(reloc_info.parent_atom_index).getAtom(macho_file).?;
254 @panic("TODO getAnonDeclVAddr");267 try parent_atom.addReloc(macho_file, .{
268 .tag = .@"extern",
269 .offset = @intCast(reloc_info.offset),
270 .target = sym.nlist_idx,
271 .addend = reloc_info.addend,
272 .type = .unsigned,
273 .meta = .{
274 .pcrel = false,
275 .has_subtractor = false,
276 .length = 3,
277 .symbolnum = @intCast(sym.nlist_idx),
278 },
279 });
280 return vaddr;
255}281}
256282
257pub fn lowerAnonDecl(283pub fn lowerAnonDecl(