aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-09-05 23:30:06 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-09-05 23:30:06 +0200
commit61dca19107a30011ba67754ff867c858024eb5c5 (patch)
tree17ca3a623ce63d4ce5a891ff8845e43b5b1e9771 /src
parentea8808f87b319c92dd74d75f1bb4fae1180e00ed (diff)
downloadzig-61dca19107a30011ba67754ff867c858024eb5c5.tar.gz
zig-61dca19107a30011ba67754ff867c858024eb5c5.zip
macho: encaps logic for extract sect offset into fn
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO.zig100
1 files changed, 40 insertions, 60 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 214c4f67f0..40c2c0dd83 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -1667,18 +1667,8 @@ pub fn allocateAtom(self: *MachO, atom: *TextBlock, match: MatchingSection) !u64
const expand_section = atom_placement == null or atom_placement.?.next == null;
if (expand_section) {
const needed_size = (vaddr + atom.size) - sect.addr;
- const sect_offset: u64 = blk: {
- if (self.data_segment_cmd_index.? == match.seg) {
- if (self.bss_section_index) |idx| {
- if (idx == match.sect) break :blk self.bss_file_offset.?;
- }
- if (self.tlv_bss_section_index) |idx| {
- if (idx == match.sect) break :blk self.tlv_bss_file_offset.?;
- }
- }
- break :blk sect.offset;
- };
- const file_offset = sect_offset + vaddr - sect.addr;
+ const sect_offset = self.getPtrToSectionOffset(match);
+ const file_offset = sect_offset.* + vaddr - sect.addr;
const max_size = seg.allocatedSize(file_offset);
log.debug(" (section {s},{s} needed size 0x{x}, max available size 0x{x})", .{
commands.segmentName(sect.*),
@@ -1741,38 +1731,28 @@ pub fn allocateAtom(self: *MachO, atom: *TextBlock, match: MatchingSection) !u64
});
for (next_seg.sections.items) |*moved_sect, moved_sect_id| {
- // TODO put below snippet in a function.
- const moved_sect_offset = blk: {
- if (self.data_segment_cmd_index.? == next) {
- if (self.bss_section_index) |idx| {
- if (idx == moved_sect_id) break :blk &self.bss_file_offset.?;
- }
- if (self.tlv_bss_section_index) |idx| {
- if (idx == moved_sect_id) break :blk &self.tlv_bss_file_offset.?;
- }
- }
- break :blk &moved_sect.offset;
+ const moved_match = MatchingSection{
+ .seg = @intCast(u16, next),
+ .sect = @intCast(u16, moved_sect_id),
};
- moved_sect_offset.* += offset_amt;
+ const ptr_sect_offset = self.getPtrToSectionOffset(moved_match);
+ ptr_sect_offset.* += offset_amt;
moved_sect.addr += offset_amt;
log.debug(" (new {s},{s} file offsets from 0x{x} to 0x{x} (in memory 0x{x} to 0x{x}))", .{
commands.segmentName(moved_sect.*),
commands.sectionName(moved_sect.*),
- moved_sect_offset.*,
- moved_sect_offset.* + moved_sect.size,
+ ptr_sect_offset.*,
+ ptr_sect_offset.* + moved_sect.size,
moved_sect.addr,
moved_sect.addr + moved_sect.size,
});
- try self.allocateLocalSymbols(.{
- .seg = @intCast(u16, next),
- .sect = @intCast(u16, moved_sect_id),
- }, offset_amt);
+ try self.allocateLocalSymbols(moved_match, offset_amt);
}
}
}
- sect.offset = new_offset;
- sect.addr = seg.inner.vmaddr + sect.offset - seg.inner.fileoff;
+ sect_offset.* = new_offset;
+ sect.addr = seg.inner.vmaddr + sect_offset.* - seg.inner.fileoff;
log.debug(" (found new {s},{s} free space from 0x{x} to 0x{x})", .{
commands.segmentName(sect.*),
commands.sectionName(sect.*),
@@ -1820,17 +1800,7 @@ pub fn writeAtom(self: *MachO, atom: *TextBlock, match: MatchingSection) !void {
const seg = self.load_commands.items[match.seg].Segment;
const sect = seg.sections.items[match.sect];
const sym = self.locals.items[atom.local_sym_index];
- const sect_offset: u64 = blk: {
- if (self.data_segment_cmd_index.? == match.seg) {
- if (self.bss_section_index) |idx| {
- if (idx == match.sect) break :blk self.bss_file_offset.?;
- }
- if (self.tlv_bss_section_index) |idx| {
- if (idx == match.sect) break :blk self.tlv_bss_file_offset.?;
- }
- }
- break :blk sect.offset;
- };
+ const sect_offset = self.getPtrToSectionOffset(match).*;
const file_offset = sect_offset + sym.n_value - sect.addr;
try atom.resolveRelocs(self);
log.debug("writing atom for symbol {s} at file offset 0x{x}", .{ self.getString(sym.n_strx), file_offset });
@@ -3896,6 +3866,25 @@ fn allocateSection(
return index;
}
+fn getPtrToSectionOffset(self: *MachO, match: MatchingSection) *u32 {
+ if (self.data_segment_cmd_index.? == match.seg) {
+ if (self.bss_section_index) |idx| {
+ if (idx == match.sect) {
+ return &self.bss_file_offset.?;
+ }
+ }
+ if (self.tlv_bss_section_index) |idx| {
+ if (idx == match.sect) {
+ return &self.tlv_bss_file_offset.?;
+ }
+ }
+ }
+
+ const seg = &self.load_commands.items[match.seg].Segment;
+ const sect = &seg.sections.items[match.sect];
+ return &sect.offset;
+}
+
fn allocateTextBlock(self: *MachO, text_block: *TextBlock, new_block_size: u64, alignment: u64) !u64 {
const text_segment = &self.load_commands.items[self.text_segment_cmd_index.?].Segment;
const text_section = &text_segment.sections.items[self.text_section_index.?];
@@ -4028,32 +4017,23 @@ fn allocateTextBlock(self: *MachO, text_block: *TextBlock, new_block_size: u64,
for (next_seg.sections.items) |*moved_sect, moved_sect_id| {
// TODO put below snippet in a function.
- const moved_sect_offset = blk: {
- if (self.data_segment_cmd_index.? == next) {
- if (self.bss_section_index) |idx| {
- if (idx == moved_sect_id) break :blk &self.bss_file_offset.?;
- }
- if (self.tlv_bss_section_index) |idx| {
- if (idx == moved_sect_id) break :blk &self.tlv_bss_file_offset.?;
- }
- }
- break :blk &moved_sect.offset;
+ const moved_match = MatchingSection{
+ .seg = @intCast(u16, next),
+ .sect = @intCast(u16, moved_sect_id),
};
- moved_sect_offset.* += offset_amt;
+ const ptr_sect_offset = self.getPtrToSectionOffset(moved_match);
+ ptr_sect_offset.* += offset_amt;
moved_sect.addr += offset_amt;
log.debug(" (new {s},{s} file offsets from 0x{x} to 0x{x} (in memory 0x{x} to 0x{x}))", .{
commands.segmentName(moved_sect.*),
commands.sectionName(moved_sect.*),
- moved_sect_offset.*,
- moved_sect_offset.* + moved_sect.size,
+ ptr_sect_offset.*,
+ ptr_sect_offset.* + moved_sect.size,
moved_sect.addr,
moved_sect.addr + moved_sect.size,
});
- try self.allocateLocalSymbols(.{
- .seg = @intCast(u16, next),
- .sect = @intCast(u16, moved_sect_id),
- }, offset_amt);
+ try self.allocateLocalSymbols(moved_match, offset_amt);
}
}
}