@@ -982,9 +982,120 @@ fn parseBindInfo(self: Object, data: []const u8, bindings: *std.ArrayList(Bindin
982
982
}
983
983
}
984
984
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
+
985
1084
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 )});
988
1099
}
989
1100
990
1101
pub fn printExportsTrie (self : Object , writer : anytype ) ! void {
0 commit comments