macho: reserve space for __got_zig rebase opcodes
This commit is contained in:
parent
16b66588f0
commit
7647db3273
|
@ -93,11 +93,11 @@ zig_data_seg_index: ?u8 = null,
|
|||
zig_bss_seg_index: ?u8 = null,
|
||||
|
||||
/// Tracked section headers with incremental updates to Zig object.
|
||||
zig_text_section_index: ?u8 = null,
|
||||
zig_got_section_index: ?u8 = null,
|
||||
zig_const_section_index: ?u8 = null,
|
||||
zig_data_section_index: ?u8 = null,
|
||||
zig_bss_section_index: ?u8 = null,
|
||||
zig_text_sect_index: ?u8 = null,
|
||||
zig_got_sect_index: ?u8 = null,
|
||||
zig_const_sect_index: ?u8 = null,
|
||||
zig_data_sect_index: ?u8 = null,
|
||||
zig_bss_sect_index: ?u8 = null,
|
||||
|
||||
has_tlv: bool = false,
|
||||
binds_to_weak: bool = false,
|
||||
|
@ -2423,6 +2423,7 @@ fn initDyldInfoSections(self: *MachO) !void {
|
|||
|
||||
const gpa = self.base.comp.gpa;
|
||||
|
||||
if (self.zig_got_sect_index != null) try self.zig_got.addDyldRelocs(self);
|
||||
if (self.got_sect_index != null) try self.got.addDyldRelocs(self);
|
||||
if (self.tlv_ptr_sect_index != null) try self.tlv_ptr.addDyldRelocs(self);
|
||||
if (self.la_symbol_ptr_sect_index != null) try self.la_symbol_ptr.addDyldRelocs(self);
|
||||
|
@ -3291,7 +3292,7 @@ fn initMetadata(self: *MachO, options: InitMetadataOptions) !void {
|
|||
}.appendSect;
|
||||
|
||||
{
|
||||
self.zig_text_section_index = try self.addSection("__TEXT_ZIG", "__text_zig", .{
|
||||
self.zig_text_sect_index = try self.addSection("__TEXT_ZIG", "__text_zig", .{
|
||||
.alignment = switch (self.getTarget().cpu.arch) {
|
||||
.aarch64 => 2,
|
||||
.x86_64 => 0,
|
||||
|
@ -3299,31 +3300,31 @@ fn initMetadata(self: *MachO, options: InitMetadataOptions) !void {
|
|||
},
|
||||
.flags = macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS,
|
||||
});
|
||||
appendSect(self, self.zig_text_section_index.?, self.zig_text_seg_index.?);
|
||||
appendSect(self, self.zig_text_sect_index.?, self.zig_text_seg_index.?);
|
||||
}
|
||||
|
||||
if (!self.base.isRelocatable()) {
|
||||
self.zig_got_section_index = try self.addSection("__GOT_ZIG", "__got_zig", .{
|
||||
self.zig_got_sect_index = try self.addSection("__GOT_ZIG", "__got_zig", .{
|
||||
.alignment = 3,
|
||||
});
|
||||
appendSect(self, self.zig_got_section_index.?, self.zig_got_seg_index.?);
|
||||
appendSect(self, self.zig_got_sect_index.?, self.zig_got_seg_index.?);
|
||||
}
|
||||
|
||||
{
|
||||
self.zig_const_section_index = try self.addSection("__CONST_ZIG", "__const_zig", .{});
|
||||
appendSect(self, self.zig_const_section_index.?, self.zig_const_seg_index.?);
|
||||
self.zig_const_sect_index = try self.addSection("__CONST_ZIG", "__const_zig", .{});
|
||||
appendSect(self, self.zig_const_sect_index.?, self.zig_const_seg_index.?);
|
||||
}
|
||||
|
||||
{
|
||||
self.zig_data_section_index = try self.addSection("__DATA_ZIG", "__data_zig", .{});
|
||||
appendSect(self, self.zig_data_section_index.?, self.zig_data_seg_index.?);
|
||||
self.zig_data_sect_index = try self.addSection("__DATA_ZIG", "__data_zig", .{});
|
||||
appendSect(self, self.zig_data_sect_index.?, self.zig_data_seg_index.?);
|
||||
}
|
||||
|
||||
{
|
||||
self.zig_bss_section_index = try self.addSection("__BSS_ZIG", "__bss_zig", .{
|
||||
self.zig_bss_sect_index = try self.addSection("__BSS_ZIG", "__bss_zig", .{
|
||||
.flags = macho.S_ZEROFILL,
|
||||
});
|
||||
appendSect(self, self.zig_bss_section_index.?, self.zig_bss_seg_index.?);
|
||||
appendSect(self, self.zig_bss_sect_index.?, self.zig_bss_seg_index.?);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -416,7 +416,7 @@ pub fn lowerAnonDecl(
|
|||
name,
|
||||
tv,
|
||||
decl_alignment,
|
||||
macho_file.zig_const_section_index.?,
|
||||
macho_file.zig_const_sect_index.?,
|
||||
src_loc,
|
||||
) catch |err| switch (err) {
|
||||
error.OutOfMemory => return error.OutOfMemory,
|
||||
|
@ -712,7 +712,7 @@ fn getDeclOutputSection(
|
|||
const any_non_single_threaded = macho_file.base.comp.config.any_non_single_threaded;
|
||||
_ = any_non_single_threaded;
|
||||
const sect_id: u8 = switch (decl.ty.zigTypeTag(mod)) {
|
||||
.Fn => macho_file.zig_text_section_index.?,
|
||||
.Fn => macho_file.zig_text_sect_index.?,
|
||||
else => blk: {
|
||||
if (decl.getOwnedVariable(mod)) |variable| {
|
||||
// if (variable.is_threadlocal and any_non_single_threaded) {
|
||||
|
@ -731,13 +731,13 @@ fn getDeclOutputSection(
|
|||
// );
|
||||
// }
|
||||
|
||||
if (variable.is_const) break :blk macho_file.zig_const_section_index.?;
|
||||
if (variable.is_const) break :blk macho_file.zig_const_sect_index.?;
|
||||
if (Value.fromInterned(variable.init).isUndefDeep(mod)) {
|
||||
// TODO: get the optimize_mode from the Module that owns the decl instead
|
||||
// of using the root module here.
|
||||
break :blk switch (macho_file.base.comp.root_mod.optimize_mode) {
|
||||
.Debug, .ReleaseSafe => macho_file.zig_data_section_index.?,
|
||||
.ReleaseFast, .ReleaseSmall => macho_file.zig_bss_section_index.?,
|
||||
.Debug, .ReleaseSafe => macho_file.zig_data_sect_index.?,
|
||||
.ReleaseFast, .ReleaseSmall => macho_file.zig_bss_sect_index.?,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -746,10 +746,10 @@ fn getDeclOutputSection(
|
|||
const is_all_zeroes = for (code) |byte| {
|
||||
if (byte != 0) break false;
|
||||
} else true;
|
||||
if (is_all_zeroes) break :blk macho_file.zig_bss_section_index.?;
|
||||
break :blk macho_file.zig_data_section_index.?;
|
||||
if (is_all_zeroes) break :blk macho_file.zig_bss_sect_index.?;
|
||||
break :blk macho_file.zig_data_sect_index.?;
|
||||
}
|
||||
break :blk macho_file.zig_const_section_index.?;
|
||||
break :blk macho_file.zig_const_sect_index.?;
|
||||
},
|
||||
};
|
||||
return sect_id;
|
||||
|
@ -778,7 +778,7 @@ pub fn lowerUnnamedConst(
|
|||
name,
|
||||
typed_value,
|
||||
typed_value.ty.abiAlignment(mod),
|
||||
macho_file.zig_const_section_index.?,
|
||||
macho_file.zig_const_sect_index.?,
|
||||
decl.srcLoc(mod),
|
||||
)) {
|
||||
.ok => |sym_index| sym_index,
|
||||
|
@ -995,8 +995,8 @@ fn updateLazySymbol(
|
|||
};
|
||||
|
||||
const output_section_index = switch (lazy_sym.kind) {
|
||||
.code => macho_file.zig_text_section_index.?,
|
||||
.const_data => macho_file.zig_const_section_index.?,
|
||||
.code => macho_file.zig_text_sect_index.?,
|
||||
.const_data => macho_file.zig_const_sect_index.?,
|
||||
};
|
||||
const sym = macho_file.getSymbol(symbol_index);
|
||||
sym.name = name_str_index;
|
||||
|
|
|
@ -32,13 +32,13 @@ pub const ZigGotSection = struct {
|
|||
|
||||
pub fn entryOffset(zig_got: ZigGotSection, index: Index, macho_file: *MachO) u64 {
|
||||
_ = zig_got;
|
||||
const sect = macho_file.sections.items(.header)[macho_file.zig_got_section_index.?];
|
||||
const sect = macho_file.sections.items(.header)[macho_file.zig_got_sect_index.?];
|
||||
return sect.offset + @sizeOf(u64) * index;
|
||||
}
|
||||
|
||||
pub fn entryAddress(zig_got: ZigGotSection, index: Index, macho_file: *MachO) u64 {
|
||||
_ = zig_got;
|
||||
const sect = macho_file.sections.items(.header)[macho_file.zig_got_section_index.?];
|
||||
const sect = macho_file.sections.items(.header)[macho_file.zig_got_sect_index.?];
|
||||
return sect.addr + @sizeOf(u64) * index;
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ pub const ZigGotSection = struct {
|
|||
pub fn writeOne(zig_got: *ZigGotSection, macho_file: *MachO, index: Index) !void {
|
||||
if (zig_got.dirty) {
|
||||
const needed_size = zig_got.size(macho_file);
|
||||
try macho_file.growSection(macho_file.zig_got_section_index.?, needed_size);
|
||||
try macho_file.growSection(macho_file.zig_got_sect_index.?, needed_size);
|
||||
zig_got.dirty = false;
|
||||
}
|
||||
const off = zig_got.entryOffset(index, macho_file);
|
||||
|
@ -77,7 +77,7 @@ pub const ZigGotSection = struct {
|
|||
const seg_id = macho_file.sections.items(.segment_id)[macho_file.zig_got_sect_index.?];
|
||||
const seg = macho_file.segments.items[seg_id];
|
||||
|
||||
for (0..zig_got.symbols.items.len) |idx| {
|
||||
for (0..zig_got.entries.items.len) |idx| {
|
||||
const addr = zig_got.entryAddress(@intCast(idx), macho_file);
|
||||
try macho_file.rebase.entries.append(gpa, .{
|
||||
.offset = addr - seg.vmaddr,
|
||||
|
|
Loading…
Reference in New Issue
Block a user