Skip to content

Commit 2d2f6e9

Browse files
committedSep 17, 2024·
object: parse dyld_chained_fixups_header and add macho defs
1 parent cf9ec52 commit 2d2f6e9

File tree

1 file changed

+113
-2
lines changed

1 file changed

+113
-2
lines changed
 

‎src/Object.zig

+113-2
Original file line numberDiff line numberDiff line change
@@ -982,9 +982,120 @@ fn parseBindInfo(self: Object, data: []const u8, bindings: *std.ArrayList(Bindin
982982
}
983983
}
984984

985+
const dyld_chained_fixups_header = extern struct {
986+
fixups_version: u32,
987+
starts_offset: u32,
988+
imports_offset: u32,
989+
symbols_offset: u32,
990+
imports_count: u32,
991+
imports_format: dyld_chained_import_format,
992+
symbols_format: dyld_chained_symbol_format,
993+
};
994+
995+
const dyld_chained_import_format = enum(u32) {
996+
import = 1,
997+
import_addend = 2,
998+
import_addend64 = 3,
999+
_,
1000+
};
1001+
1002+
const dyld_chained_symbol_format = enum(u32) {
1003+
uncompressed = 0,
1004+
zlib = 1,
1005+
};
1006+
1007+
const dyld_chained_starts_in_image = extern struct {
1008+
seg_count: u32,
1009+
seg_info_count: [1]u32,
1010+
};
1011+
1012+
const dyld_chained_starts_in_segment = extern struct {
1013+
size: u32,
1014+
page_size: u32,
1015+
pointer_format: dyld_chained_ptr,
1016+
segment_offset: u64,
1017+
max_valid_pointer: u32,
1018+
page_count: u16,
1019+
page_start: [1]u16,
1020+
};
1021+
1022+
const dyld_chained_ptr_start = struct {
1023+
const none: u16 = 0xffff;
1024+
const multi: u16 = 0x8000;
1025+
const last: u16 = 0x8000;
1026+
};
1027+
1028+
const dyld_chained_ptr = enum(u16) {
1029+
arm64e = 1,
1030+
@"64" = 2,
1031+
@"32" = 3,
1032+
@"32_cache" = 4,
1033+
@"32_firmware" = 5,
1034+
@"64_offset" = 6,
1035+
arm64e_kernel = 7,
1036+
@"64_kernel_cache" = 8,
1037+
arm64e_userland = 9,
1038+
arm64_firmware = 10,
1039+
x86_64_kernel_cache = 11,
1040+
arm64e_userland24 = 12,
1041+
};
1042+
1043+
const dyld_chained_import = packed struct(u32) {
1044+
lib_ordinal: u8,
1045+
weak_import: bool,
1046+
name_offset: u23,
1047+
};
1048+
1049+
const dyld_chained_import_addend = extern struct {
1050+
hdr: packed struct(u32) {
1051+
lib_ordinal: u8,
1052+
weak_import: bool,
1053+
name_offset: u23,
1054+
},
1055+
addend: i32,
1056+
};
1057+
1058+
const dyld_chained_import_addend64 = extern struct {
1059+
hdr: packed struct(u64) {
1060+
lib_ordinal: u16,
1061+
weak_import: bool,
1062+
reserved: u15 = 0,
1063+
name_offset: u32,
1064+
},
1065+
addend: u64,
1066+
};
1067+
1068+
const dyld_chained_ptr_64_bind = packed struct(u64) {
1069+
ordinal: u24,
1070+
addend: u8,
1071+
reserved: u19 = 0,
1072+
next: u12,
1073+
bind: bool = true, // always set to true
1074+
};
1075+
1076+
const dyld_chained_ptr_64_rebase = packed struct(u64) {
1077+
target: u36,
1078+
high8: u8,
1079+
reserved: u7 = 0,
1080+
next: u12,
1081+
bind: bool = false, // always set to false
1082+
};
1083+
9851084
pub fn printChainedFixups(self: Object, writer: anytype) !void {
986-
_ = self;
987-
_ = writer;
1085+
const lc = self.dyld_chained_fixups_lc orelse
1086+
return writer.print("LC_DYLD_CHAINED_FIXUPS load command not found\n", .{});
1087+
const data = self.data[lc.dataoff..][0..lc.datasize];
1088+
const hdr = @as(*align(1) const dyld_chained_fixups_header, @ptrCast(data.ptr)).*;
1089+
try writer.writeAll("CHAINED FIXUPS HEADER:\n");
1090+
try writer.print(" fixups_version : {d}\n", .{hdr.fixups_version});
1091+
try writer.print(" starts_offset : 0x{x} ({d})\n", .{ hdr.starts_offset, hdr.starts_offset });
1092+
try writer.print(" imports_offset : 0x{x} ({d})\n", .{ hdr.imports_offset, hdr.imports_offset });
1093+
try writer.print(" symbols_offset : 0x{x} ({d})\n", .{ hdr.symbols_offset, hdr.symbols_offset });
1094+
try writer.print(" imports_count : {d}\n", .{hdr.imports_count});
1095+
try writer.print(" imports_format : {d} ({s})\n", .{ @as(u32, @intFromEnum(hdr.imports_format)), @tagName(hdr.imports_format) });
1096+
try writer.print(" symbols_format : {d} ({s})\n", .{ @as(u32, @intFromEnum(hdr.symbols_format)), @tagName(hdr.symbols_format) });
1097+
1098+
try writer.print("{x}\n", .{std.fmt.fmtSliceHexLower(data)});
9881099
}
9891100

9901101
pub fn printExportsTrie(self: Object, writer: anytype) !void {

0 commit comments

Comments
 (0)
Please sign in to comment.