@@ -183,6 +183,47 @@ EmbeddedAssemblies::zip_load_individual_assembly_entries (std::vector<uint8_t> c
183
183
}
184
184
}
185
185
186
+
187
+ [[gnu::always_inline]] void
188
+ EmbeddedAssemblies::verify_assembly_store_and_set_info (void *data_start, const char *name) noexcept
189
+ {
190
+ auto header = static_cast <AssemblyStoreHeader*>(data_start);
191
+
192
+ if (header->magic != ASSEMBLY_STORE_MAGIC) {
193
+ Helpers::abort_application (
194
+ LOG_ASSEMBLY,
195
+ Util::monodroid_strdup_printf (
196
+ " Assembly store '%s' is not a valid .NET for Android assembly store file" ,
197
+ entry_name.get ()
198
+ )
199
+ );
200
+ }
201
+
202
+ if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
203
+ Helpers::abort_application (
204
+ LOG_ASSEMBLY,
205
+ Util::monodroid_strdup_printf (
206
+ " Assembly store '%s' uses format version 0x%x, instead of the expected 0x%x" ,
207
+ entry_name.get (),
208
+ header->version ,
209
+ ASSEMBLY_STORE_FORMAT_VERSION
210
+ )
211
+ );
212
+ }
213
+
214
+ constexpr size_t header_size = sizeof (AssemblyStoreHeader);
215
+
216
+ assembly_store.data_start = static_cast <uint8_t *>(data_start);
217
+ assembly_store.assembly_count = header->entry_count ;
218
+ assembly_store.index_entry_count = header->index_entry_count ;
219
+ assembly_store.assemblies = reinterpret_cast <AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size );
220
+ assembly_store_hashes = reinterpret_cast <AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
221
+
222
+ number_of_found_assemblies += assembly_store.assembly_count ;
223
+ number_of_mapped_assembly_stores++;
224
+ have_and_want_debug_symbols = register_debug_symbols;
225
+ }
226
+
186
227
inline void
187
228
EmbeddedAssemblies::map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX> const & entry_name, ZipEntryLoadState &state) noexcept
188
229
{
@@ -219,42 +260,8 @@ EmbeddedAssemblies::map_assembly_store (dynamic_local_string<SENSIBLE_PATH_MAX>
219
260
}
220
261
221
262
auto [payload_start, payload_size] = get_wrapper_dso_payload_pointer_and_size (assembly_store_map, entry_name.get ());
222
- log_debug (LOG_ASSEMBLY, " Adjusted assembly store pointer: {:p}; size: {}" , payload_start, payload_size);
223
- auto header = static_cast <AssemblyStoreHeader*>(payload_start);
224
-
225
- if (header->magic != ASSEMBLY_STORE_MAGIC) {
226
- Helpers::abort_application (
227
- LOG_ASSEMBLY,
228
- std::format (
229
- " Assembly store '{}' is not a valid .NET for Android assembly store file" ,
230
- optional_string (entry_name.get ())
231
- )
232
- );
233
- }
234
-
235
- if (header->version != ASSEMBLY_STORE_FORMAT_VERSION) {
236
- Helpers::abort_application (
237
- LOG_ASSEMBLY,
238
- std::format (
239
- " Assembly store '{}' uses format version {:x}, instead of the expected {:x}" ,
240
- optional_string (entry_name.get ()),
241
- header->version ,
242
- ASSEMBLY_STORE_FORMAT_VERSION
243
- )
244
- );
245
- }
246
-
247
- constexpr size_t header_size = sizeof (AssemblyStoreHeader);
248
-
249
- assembly_store.data_start = static_cast <uint8_t *>(payload_start);
250
- assembly_store.assembly_count = header->entry_count ;
251
- assembly_store.index_entry_count = header->index_entry_count ;
252
- assembly_store.assemblies = reinterpret_cast <AssemblyStoreEntryDescriptor*>(assembly_store.data_start + header_size + header->index_size );
253
- assembly_store_hashes = reinterpret_cast <AssemblyStoreIndexEntry*>(assembly_store.data_start + header_size);
254
-
255
- number_of_found_assemblies += assembly_store.assembly_count ;
256
- number_of_mapped_assembly_stores++;
257
- have_and_want_debug_symbols = register_debug_symbols;
263
+ log_debug (LOG_ASSEMBLY, " Adjusted assembly store pointer: %p; size: %zu" , payload_start, payload_size);
264
+ verify_assembly_store_and_set_info (payload_start, entry_name.get ());
258
265
}
259
266
260
267
[[gnu::always_inline]] void
@@ -265,9 +272,15 @@ EmbeddedAssemblies::zip_load_assembly_store_entries (std::vector<uint8_t> const&
265
272
}
266
273
267
274
dynamic_local_string<SENSIBLE_PATH_MAX> entry_name;
268
- bool assembly_store_found = false ;
275
+ bool assembly_store_found = embedded_assembly_store_size != 0 ;
276
+ if (assembly_store_found) {
277
+ log_debug (LOG_ASSEMBLY, " Got embedded assembly store, size %zu" , embedded_assembly_store_size);
278
+ verify_assembly_store_and_set_info (embedded_assembly_store, " embedded" );
279
+ log_debug (LOG_ASSEMBLY, " Looking for DSOs in APK" );
280
+ } else {
281
+ log_debug (LOG_ASSEMBLY, " Looking for assembly store ('%s') and DSOs in APK" , assembly_store_file_path.data ());
282
+ }
269
283
270
- log_debug (LOG_ASSEMBLY, " Looking for assembly stores in APK ('{}')" , assembly_store_file_path.data ());
271
284
for (size_t i = 0uz; i < num_entries; i++) {
272
285
if (all_required_zip_entries_found ()) {
273
286
need_to_scan_more_apks = false ;
0 commit comments