| 1061 | |
| 1062 | |
| 1063 | bool MachoView::Init() |
| 1064 | { |
| 1065 | Ref<Settings> settings = GetLoadSettings(GetTypeName()); |
| 1066 | std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now(); |
| 1067 | BinaryReader reader(GetParentView()); |
| 1068 | reader.SetEndianness(m_endian); |
| 1069 | reader.SetVirtualBase(m_universalImageOffset); |
| 1070 | BinaryReader virtualReader(this); |
| 1071 | virtualReader.SetEndianness(m_endian); |
| 1072 | |
| 1073 | uint64_t initialImageBase = 0; |
| 1074 | bool initialImageBaseSet = false; |
| 1075 | string preferredImageBaseDesc; |
| 1076 | for (const auto& i : m_header.segments) |
| 1077 | { |
| 1078 | if ((i.initprot == MACHO_VM_PROT_NONE) || (!i.vmsize)) |
| 1079 | continue; |
| 1080 | |
| 1081 | if (!initialImageBaseSet) |
| 1082 | { |
| 1083 | initialImageBase = i.vmaddr; |
| 1084 | initialImageBaseSet = true; |
| 1085 | preferredImageBaseDesc = i.segname; |
| 1086 | } |
| 1087 | else if (i.vmaddr < initialImageBase) |
| 1088 | { |
| 1089 | initialImageBase = i.vmaddr; |
| 1090 | preferredImageBaseDesc = i.segname; |
| 1091 | } |
| 1092 | } |
| 1093 | |
| 1094 | SetOriginalImageBase(initialImageBase); |
| 1095 | uint64_t preferredImageBase = initialImageBase; |
| 1096 | bool platformSetByUser = false; |
| 1097 | if (settings) |
| 1098 | { |
| 1099 | if (settings->Contains("loader.imageBase")) |
| 1100 | preferredImageBase = settings->Get<uint64_t>("loader.imageBase", this); |
| 1101 | |
| 1102 | if (settings->Contains("loader.platform")) |
| 1103 | { |
| 1104 | BNSettingsScope scope = SettingsAutoScope; |
| 1105 | Ref<Platform> platform = Platform::GetByName(settings->Get<string>("loader.platform", this, &scope)); |
| 1106 | if (platform) |
| 1107 | { |
| 1108 | m_plat = platform; |
| 1109 | m_arch = platform->GetArchitecture(); |
| 1110 | platformSetByUser = (scope == SettingsResourceScope); |
| 1111 | } |
| 1112 | } |
| 1113 | } |
| 1114 | |
| 1115 | m_imageBaseAdjustment = 0; |
| 1116 | if (!initialImageBase) |
| 1117 | m_imageBaseAdjustment = preferredImageBase; |
| 1118 | else if (initialImageBase <= preferredImageBase) |
| 1119 | m_imageBaseAdjustment = preferredImageBase - initialImageBase; |
| 1120 | else |
no test coverage detected