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