aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/Object.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-10-04 12:06:52 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-10-16 19:33:04 +0200
commitd6cec5a586c55f471d3f830f34d7a5f668337fb9 (patch)
tree65080226790b92497314415963eb2f132c2c3f13 /src/link/Elf/Object.zig
parent66f34b15e8573d669ef99d47337162f2aa91d602 (diff)
downloadzig-d6cec5a586c55f471d3f830f34d7a5f668337fb9.tar.gz
zig-d6cec5a586c55f471d3f830f34d7a5f668337fb9.zip
elf: add more prepwork for linking c++ objects
Diffstat (limited to 'src/link/Elf/Object.zig')
-rw-r--r--src/link/Elf/Object.zig29
1 files changed, 1 insertions, 28 deletions
diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig
index 723b76469f..9baa5c07ed 100644
--- a/src/link/Elf/Object.zig
+++ b/src/link/Elf/Object.zig
@@ -20,7 +20,6 @@ cies: std.ArrayListUnmanaged(Cie) = .{},
alive: bool = true,
num_dynrelocs: u32 = 0,
-output_sections: std.AutoArrayHashMapUnmanaged(u16, std.ArrayListUnmanaged(Atom.Index)) = .{},
output_symtab_size: Elf.SymtabSize = .{},
pub fn isObject(file: std.fs.File) bool {
@@ -43,10 +42,6 @@ pub fn deinit(self: *Object, allocator: Allocator) void {
self.comdat_groups.deinit(allocator);
self.fdes.deinit(allocator);
self.cies.deinit(allocator);
- for (self.output_sections.values()) |*list| {
- list.deinit(allocator);
- }
- self.output_sections.deinit(allocator);
}
pub fn parse(self: *Object, elf_file: *Elf) !void {
@@ -635,7 +630,7 @@ pub fn addAtomsToOutputSections(self: *Object, elf_file: *Elf) !void {
if (shdr.sh_type == elf.SHT_NOBITS) continue;
const gpa = elf_file.base.allocator;
- const gop = try self.output_sections.getOrPut(gpa, atom.output_section_index);
+ const gop = try elf_file.output_sections.getOrPut(gpa, atom.output_section_index);
if (!gop.found_existing) gop.value_ptr.* = .{};
try gop.value_ptr.append(gpa, atom_index);
}
@@ -680,28 +675,6 @@ pub fn allocateAtoms(self: Object, elf_file: *Elf) void {
}
}
-pub fn writeAtoms(self: Object, elf_file: *Elf, output_section_index: u16, buffer: []u8, undefs: anytype) !void {
- const gpa = elf_file.base.allocator;
- const atom_list = self.output_sections.get(output_section_index) orelse return;
- const shdr = elf_file.shdrs.items[output_section_index];
- for (atom_list.items) |atom_index| {
- const atom = elf_file.atom(atom_index).?;
- assert(atom.flags.alive);
- const offset = atom.value - shdr.sh_addr;
- log.debug("writing atom({d}) at 0x{x}", .{ atom_index, shdr.sh_offset + offset });
- // TODO decompress directly into provided buffer
- const out_code = buffer[offset..][0..atom.size];
- const in_code = try self.codeDecompressAlloc(elf_file, atom_index);
- defer gpa.free(in_code);
- @memcpy(out_code, in_code);
-
- if (shdr.sh_flags & elf.SHF_ALLOC == 0)
- try atom.resolveRelocsNonAlloc(elf_file, out_code, undefs)
- else
- try atom.resolveRelocsAlloc(elf_file, out_code);
- }
-}
-
pub fn updateSymtabSize(self: *Object, elf_file: *Elf) void {
for (self.locals()) |local_index| {
const local = elf_file.symbol(local_index);