未验证 提交 2bced394 编写于 作者: Z Zoltan Varga 提交者: GitHub

Cleanup assembly loading code. (#47958)

* Cleanup the assembly loading code.

* Remove the 'problematic' assembly code.
Co-authored-by: NAleksey Kliger (λgeek) <alklig@microsoft.com>
上级 0fae37d9
......@@ -71,12 +71,9 @@ set(MONO_CORLIB_VERSION 1A5E0066-58DC-428A-B21C-0AD6CDAE2789)
set(DISABLE_REMOTING 1)
set(DISABLE_APPDOMAINS 1)
set(DISABLE_SHADOW_COPY 1)
set(DISABLE_CLEANUP 1)
set(DISABLE_ASSEMBLY_REMAPPING 1)
set(DISABLE_MDB 1)
set(DISABLE_COM 1)
set(DISABLE_GAC 1)
set(DISABLE_PERFCOUNTERS 1)
set(DISABLE_ATTACH 1)
set(DISABLE_CONFIG 1)
......@@ -84,9 +81,6 @@ set(DISABLE_CFGDIR_CONFIG 1)
set(DISABLE_VERIFIER 1)
# Dependencies between options
if(DISABLE_ASSEMBLY_REMAPPING)
set(DISABLE_DESKTOP_LOADER 1)
endif()
if(ENABLE_INTERP_LIB)
set(DISABLE_INTERPRETER 1)
endif()
......
......@@ -416,9 +416,6 @@
/* Disable generics support */
#cmakedefine DISABLE_GENERICS 1
/* Disable Shadow Copy for AppDomains */
#cmakedefine DISABLE_SHADOW_COPY 1
/* Disable agent attach support */
#cmakedefine DISABLE_ATTACH 1
......@@ -450,9 +447,6 @@
/* Disable String normalization support. */
#cmakedefine DISABLE_NORMALIZATION 1
/* Disable desktop assembly loader semantics. */
#cmakedefine DISABLE_DESKTOP_LOADER 1
/* Disable shared perfcounters. */
#cmakedefine DISABLE_SHARED_PERFCOUNTERS 1
......
......@@ -14,7 +14,6 @@ option (DISABLE_LOGGING "Disable support debug logging")
option (DISABLE_COM "Disable COM support")
option (DISABLE_SSA "Disable advanced SSA JIT optimizations")
option (DISABLE_GENERICS "Disable generics support")
option (DISABLE_SHADOW_COPY "Disable Shadow Copy for AppDomains")
option (DISABLE_ATTACH "Disable agent attach support")
option (DISABLE_VERIFIER "Disables the verifier")
option (DISABLE_JIT "Disable the JIT, only full-aot mode or interpreter will be supported by the runtime.")
......@@ -23,7 +22,6 @@ option (DISABLE_SIMD "Disable SIMD intrinsics related optimizations.")
option (DISABLE_DEBUGGER_AGENT "Disable Soft Debugger Agent.")
option (DISABLE_PERFCOUNTERS "Disable Performance Counters.")
option (DISABLE_NORMALIZATION "Disable String normalization support.")
option (DISABLE_DESKTOP_LOADER "Disable desktop assembly loader semantics.")
option (DISABLE_SHARED_PERFCOUNTERS "Disable shared perfcounters.")
option (DISABLE_APPDOMAINS "Disable support for multiple appdomains.")
option (DISABLE_REMOTING "Disable remoting support (This disables type proxies and make com non-functional)")
......
此差异已折叠。
......@@ -373,10 +373,6 @@ struct _MonoDomain {
/* Contains the compiled method used by async resylt creation to capture thread context*/
gpointer capture_context_method;
/* Assembly bindings, the per-domain part */
GSList *assembly_bindings;
gboolean assembly_bindings_parsed;
/* Used by socket-io.c */
/* These are domain specific, since the assembly can be unloaded */
MonoImage *socket_assembly;
......@@ -553,9 +549,6 @@ mono_runtime_set_no_exec (gboolean val);
gboolean
mono_runtime_get_no_exec (void);
void
mono_domain_parse_assembly_bindings (MonoDomain *domain, int amajor, int aminor, gchar *domain_config_file_name);
gboolean
mono_assembly_name_parse (const char *name, MonoAssemblyName *aname);
......@@ -576,8 +569,6 @@ mono_domain_assembly_postload_search (MonoAssemblyLoadContext *alc, MonoAssembly
int mono_framework_version (void);
void mono_assembly_cleanup_domain_bindings (guint32 domain_id);
MonoJitInfo* mono_jit_info_table_find_internal (MonoDomain *domain, gpointer addr, gboolean try_aot, gboolean allow_trampolines);
typedef void (*MonoJitInfoFunc) (MonoJitInfo *ji, gpointer user_data);
......
......@@ -432,8 +432,6 @@ mono_domain_create (void)
domain->lock_free_mp = lock_free_mempool_new ();
domain->env = mono_g_hash_table_new_type_internal ((GHashFunc)mono_string_hash_internal, (GCompareFunc)mono_string_equal_internal, MONO_HASH_KEY_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, domain, "Domain Environment Variable Table");
domain->domain_assemblies = NULL;
domain->assembly_bindings = NULL;
domain->assembly_bindings_parsed = FALSE;
domain->proxy_vtable_hash = g_hash_table_new ((GHashFunc)mono_ptrarray_hash, (GCompareFunc)mono_ptrarray_equal);
mono_jit_code_hash_init (&domain->jit_code_hash);
domain->ldstr_table = mono_g_hash_table_new_type_internal ((GHashFunc)mono_string_hash_internal, (GCompareFunc)mono_string_equal_internal, MONO_HASH_KEY_VALUE_GC, MONO_ROOT_SOURCE_DOMAIN, domain, "Domain String Pool Table");
......
......@@ -24,10 +24,4 @@ mono_image_load_module_checked (MonoImage *image, int idx, MonoError *error);
MonoImage *
mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context);
gboolean
mono_is_problematic_image (MonoImage *image);
gboolean
mono_is_problematic_file (const char *fname);
#endif /* __MONO_METADATA_IMAGE_INTERNALS_H__ */
......@@ -109,7 +109,7 @@ mono_images_unlock(void)
}
static MonoImage *
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context, gboolean *problematic);
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context);
/* Maps string keys to MonoImageStorage values.
*
......@@ -1160,178 +1160,6 @@ install_pe_loader (void)
mono_install_image_loader (&pe_loader);
}
#ifndef DISABLE_DESKTOP_LOADER
/*
Ignored assemblies.
There are some assemblies we need to ignore because they include an implementation that doesn't work under mono.
Mono provides its own implementation of those assemblies so it's safe to do so.
The ignored_assemblies list is generated using tools/nuget-hash-extractor and feeding the problematic nugets to it.
Right now the list of nugets are the ones that provide the assemblies in $ignored_assemblies_file_names.
This is to be removed once a proper fix is shipped through nuget.
Please keep this in sync with mcs/tools/xbuild/data/deniedAssembliesList.txt
If any assemblies are added/removed, then this should be regenerated with:
$ mono tools/nuget-hash-extractor/nuget-hash-extractor.exe nugets guids_for_msbuild > mcs/tools/xbuild/data/deniedAssembliesList.txt
*/
typedef enum {
SYS_RT_INTEROP_RUNTIME_INFO = 0, //System.Runtime.InteropServices.RuntimeInformation
SYS_GLOBALIZATION_EXT = 1, //System.Globalization.Extensions
SYS_IO_COMPRESSION = 2, //System.IO.Compression
SYS_NET_HTTP = 3, //System.Net.Http
SYS_TEXT_ENC_CODEPAGES = 4, //System.Text.Encoding.CodePages
SYS_THREADING_OVERLAPPED = 5, //System.Threading.Overlapped
} IgnoredAssemblyNames;
typedef struct {
int hash;
int assembly_name;
char guid [40];
} IgnoredAssembly;
typedef struct {
int assembly_name;
guint16 major, minor, build, revision;
} IgnoredAssemblyVersion;
static const char *ignored_assemblies_file_names[] = {
"System.Runtime.InteropServices.RuntimeInformation.dll",
"System.Globalization.Extensions.dll",
"System.IO.Compression.dll",
"System.Net.Http.dll",
"System.Text.Encoding.CodePages.dll",
"System.Threading.Overlapped.dll"
};
#define IGNORED_ASSEMBLY(HASH, NAME, GUID, VER_STR) { (int)HASH, NAME, GUID }
static const IgnoredAssembly ignored_assemblies [] = {
IGNORED_ASSEMBLY (0x10CADA75, SYS_NET_HTTP, "EA2EC6DC-51DD-479C-BFC2-E713FB9E7E47", "4.1.1 net46"),
IGNORED_ASSEMBLY (0x1136045D, SYS_GLOBALIZATION_EXT, "475DBF02-9F68-44F1-8FB5-C9F69F1BD2B1", "4.0.0 net46"),
IGNORED_ASSEMBLY (0x1438EAE0, SYS_RT_INTEROP_RUNTIME_INFO, "F580BAAC-12BD-4716-B486-C0A5E3EE6EEA", "15.5.0-preview-20171027-2 net461"),
IGNORED_ASSEMBLY (0x16BCA997, SYS_RT_INTEROP_RUNTIME_INFO, "CA2D23DE-55E1-45D8-9720-0EBE3EEC1DF2", "2.0.0-preview3-20170622-1 net462"),
IGNORED_ASSEMBLY (0x17A113, SYS_RT_INTEROP_RUNTIME_INFO, "D87389D8-6E9C-48CF-B128-3637018577AF", "2.1.0-preview1-62414-02 net47"),
IGNORED_ASSEMBLY (0x1CBD59A2, SYS_IO_COMPRESSION, "44FCA06C-A510-4B3E-BDBF-D08D697EF65A", "4.1.0 net46"),
IGNORED_ASSEMBLY (0x1EA951BB, SYS_IO_COMPRESSION, "05C07BD4-AFF1-4B12-900B-F0A5EB88DDB4", "2.1.0-preview1-62414-02 net461"),
IGNORED_ASSEMBLY (0x1FB3F8E8, SYS_GLOBALIZATION_EXT, "B9BA8638-25D2-4A3B-B91F-16B3D3799861", "2.1.100-preview-62617-01 net461"),
IGNORED_ASSEMBLY (0x2706B80, SYS_NET_HTTP, "8E2F55F3-D010-417B-A742-21386EDDD388", "2.0.0-preview3-20170622-1 net461"),
IGNORED_ASSEMBLY (0x27726A90, SYS_NET_HTTP, "269B562C-CC15-4736-B1B1-68D4A43CAA98", "4.1.0 net46"),
IGNORED_ASSEMBLY (0x284ECF63, SYS_THREADING_OVERLAPPED, "E933407E-C846-4413-82C5-09F4BCFA67F1", "2.1.0-preview1-62414-02 net461"),
IGNORED_ASSEMBLY (0x358C9723, SYS_GLOBALIZATION_EXT, "5FCD54F0-4B97-4259-875D-30E481F02EA2", "4.0.1 net46"),
IGNORED_ASSEMBLY (0x39C3575D, SYS_GLOBALIZATION_EXT, "3B30D67C-B16B-47BC-B949-9500B5AAAAFB", "2.1.0-preview1-62414-02 net471"),
IGNORED_ASSEMBLY (0x3E21E75A, SYS_TEXT_ENC_CODEPAGES, "67D3A14A-8F55-4C9F-9699-EDD0876369DA", "4.5.0 net461"),
IGNORED_ASSEMBLY (0x420963C4, SYS_NET_HTTP, "084B071E-1637-4B3F-B7CD-6CEF28A6E4AE", "4.3.4 net46"),
IGNORED_ASSEMBLY (0x450A096A, SYS_GLOBALIZATION_EXT, "E9FCFF5B-4DE1-4BDC-9CE8-08C640FC78CC", "4.3.0 net46"),
IGNORED_ASSEMBLY (0x46A4A1C5, SYS_RT_INTEROP_RUNTIME_INFO, "F13660F8-9D0D-419F-BA4E-315693DD26EA", "4.0.0 net45"),
IGNORED_ASSEMBLY (0x472FA630, SYS_NET_HTTP, "09D4A140-061C-4884-9B63-22067E841931", "4.3.2 net46"),
IGNORED_ASSEMBLY (0x4CC79B26, SYS_GLOBALIZATION_EXT, "28006E9A-74DB-45AC-8A8D-030CEBAA272A", "2.0.0-preview3-20170622-1 net461"),
IGNORED_ASSEMBLY (0x4E906129, SYS_NET_HTTP, "27BBDD4C-EAF0-4A95-B172-EE502D76A725", "2.1.100-preview-62617-01 net461"),
IGNORED_ASSEMBLY (0x5E393C29, SYS_IO_COMPRESSION, "3A58A219-266B-47C3-8BE8-4E4F394147AB", "4.3.0 net46"),
IGNORED_ASSEMBLY (0x662BC58F, SYS_IO_COMPRESSION, "C786B28D-0850-4D4C-AED9-FE6B86EE7C31", "2.1.0-preview1-62414-02 net471"),
IGNORED_ASSEMBLY (0x66CEDA9, SYS_THREADING_OVERLAPPED, "A0439CB6-A5E6-4813-A76C-13F92ADDDED5", "2.1.100-preview-62617-01 net461"),
IGNORED_ASSEMBLY (0x6AE7C015, SYS_IO_COMPRESSION, "35DD20B5-8766-476B-B5D2-0EA16EF0A946", "2.1.100-preview-62617-01 net461"),
IGNORED_ASSEMBLY (0x6FE03EE2, SYS_THREADING_OVERLAPPED, "87697E71-D192-4F0B-BAD4-02BBC7793005", "4.3.0 net46"),
IGNORED_ASSEMBLY (0x74EA304F, SYS_RT_INTEROP_RUNTIME_INFO, "E5AE3324-2100-4F77-9E41-AEEF226C9649", "15.5.0-preview-20171027-2 net47"),
IGNORED_ASSEMBLY (0x765A8E04, SYS_RT_INTEROP_RUNTIME_INFO, "E46BA45E-6A63-47CD-AF70-2C3016AFF75A", "2.1.100-preview-62617-01 net461"),
IGNORED_ASSEMBLY (0x786145B9, SYS_RT_INTEROP_RUNTIME_INFO, "0C4BCFB3-F609-4631-93A6-17B19C69D9B6", "2.0.0-preview3-20170622-1 net47"),
IGNORED_ASSEMBLY (0x79F6E37F, SYS_THREADING_OVERLAPPED, "212BEDF2-E3F5-4D59-8C1A-F4D1C58B46CD", "15.5.0-preview-20171027-2 net461"),
IGNORED_ASSEMBLY (0x7D927C2A, SYS_THREADING_OVERLAPPED, "FCBD003B-2BB4-4940-BAEF-63AF520C2336", "4.0.1 net46"),
IGNORED_ASSEMBLY (0x8437178B, SYS_NET_HTTP, "C0E04D9C-70CF-48A6-A179-FBFD8CE69FD0", "4.3.0 net46"),
IGNORED_ASSEMBLY (0x8BFCB05D, SYS_THREADING_OVERLAPPED, "82D565AC-E41C-4E29-9939-C031C88EDBDD", "2.1.100-preview-62617-01 net471"),
IGNORED_ASSEMBLY (0x8CCF2469, SYS_RT_INTEROP_RUNTIME_INFO, "9A3724BF-DF8F-4955-8CFA-41D45F11B586", "2.1.0-preview1-62414-02 net462"),
IGNORED_ASSEMBLY (0x90772EB6, SYS_THREADING_OVERLAPPED, "F4FFC4A6-E694-49D9-81B2-12F2C9A29652", "2.0.0-preview3-20170622-1 net461"),
IGNORED_ASSEMBLY (0x911D9EC3, SYS_TEXT_ENC_CODEPAGES, "C142254F-DEB5-46A7-AE43-6F10320D1D1F", "4.0.1 net46"),
IGNORED_ASSEMBLY (0x96B5F0BA, SYS_NET_HTTP, "DB06A592-E332-44A1-8B85-20CAB3C3C147", "2.1.0-preview1-62414-02 net461"),
IGNORED_ASSEMBLY (0x9DBB28A2, SYS_NET_HTTP, "903A137B-BB3F-464A-94D4-780B89EE5580", "2.1.0-preview1-62414-02 net471"),
IGNORED_ASSEMBLY (0xA2E8EC53, SYS_RT_INTEROP_RUNTIME_INFO, "6D334D4D-0149-4D07-9DEF-CC52213145CE", "2.0.0-preview3-20170622-1 net461"),
IGNORED_ASSEMBLY (0xA3BFE786, SYS_RT_INTEROP_RUNTIME_INFO, "33D296D9-EE6D-404E-BF9F-432A429FF5DA", "15.5.0-preview-20171027-2 net462"),
IGNORED_ASSEMBLY (0xA99E866F, SYS_NET_HTTP, "41ACE450-8F44-455A-97AC-0679E5462071", "2.1.100-preview-62617-01 net471"),
IGNORED_ASSEMBLY (0xAA21986B, SYS_THREADING_OVERLAPPED, "9F5D4F09-787A-458A-BA08-553AA71470F1", "4.0.0 net46"),
IGNORED_ASSEMBLY (0xAF2093B8, SYS_TEXT_ENC_CODEPAGES, "D2B4F262-31A4-4E80-9CFB-26A2249A735E", "4.5.1 net461"),
IGNORED_ASSEMBLY (0xC69BED92, SYS_IO_COMPRESSION, "33AD8174-7781-46FA-A110-33821CCBE810", "15.5.0-preview-20171027-2 net461"),
IGNORED_ASSEMBLY (0xC8D00759, SYS_IO_COMPRESSION, "1332CE2F-1517-4BD7-93FD-7D4BCFBAED66", "2.0.0-preview3-20170622-1 net461"),
IGNORED_ASSEMBLY (0xCA951D5B, SYS_RT_INTEROP_RUNTIME_INFO, "1F37581E-4589-4C71-A465-05C6B9AE966E", "2.1.0-preview1-62414-02 net461"),
IGNORED_ASSEMBLY (0xD00F7419, SYS_THREADING_OVERLAPPED, "3336A2A3-1772-4EF9-A74B-AFDC80A8B21E", "2.1.0-preview1-62414-02 net471"),
IGNORED_ASSEMBLY (0xD07383BB, SYS_RT_INTEROP_RUNTIME_INFO, "DD91439F-3167-478E-BD2C-BF9C036A1395", "4.3.0 net45"),
IGNORED_ASSEMBLY (0xD08A991A, SYS_NET_HTTP, "82C79759-CB3C-4EB6-A17C-BDE85AF00A9B", "15.5.0-preview-20171027-2 net461"),
IGNORED_ASSEMBLY (0xD3ABE53A, SYS_RT_INTEROP_RUNTIME_INFO, "488CE209-4E5D-40E7-BE8C-F81F2B99F13A", "2.1.100-preview-62617-01 net462"),
IGNORED_ASSEMBLY (0xDB9397A9, SYS_NET_HTTP, "56203551-6937-47C1-9246-346A733913EE", "4.3.3 net46"),
IGNORED_ASSEMBLY (0xE16ECCCD, SYS_GLOBALIZATION_EXT, "1A2B9B2A-02F5-4C78-AB0C-7C6D2795CE2B", "2.1.100-preview-62617-01 net471"),
IGNORED_ASSEMBLY (0xE4016B17, SYS_GLOBALIZATION_EXT, "50F4163A-D692-452F-90ED-2F8024BB5319", "15.5.0-preview-20171027-2 net461"),
IGNORED_ASSEMBLY (0xE758DAD4, SYS_IO_COMPRESSION, "8DBD1669-97BC-4190-9BD8-738561193741", "2.1.100-preview-62617-01 net471"),
IGNORED_ASSEMBLY (0xF6D18A2E, SYS_TEXT_ENC_CODEPAGES, "F5CCCBEC-E1AD-4DBB-9B44-9B42C86B94B8", "4.4.0 net461"),
IGNORED_ASSEMBLY (0xF9D06E1E, SYS_GLOBALIZATION_EXT, "FC1439FC-C1B8-4DB1-914D-165CCFA77002", "2.1.0-preview1-62414-02 net461"),
IGNORED_ASSEMBLY (0xFA686A38, SYS_TEXT_ENC_CODEPAGES, "FD178CD4-EF4F-44D5-9C3F-812B1E25126B", "4.3.0 net46"),
IGNORED_ASSEMBLY (0xFAFDA422, SYS_NET_HTTP, "817F01C3-4011-477D-890A-98232B85553D", "4.3.1 net46"),
IGNORED_ASSEMBLY (0xFC67D3A7, SYS_RT_INTEROP_RUNTIME_INFO, "FD6C8616-C1D8-43F9-AC17-A1C48A45FDA2", "2.1.100-preview-62617-01 net47")
};
static const char *ignored_assemblies_names[] = {
"System.Runtime.InteropServices.RuntimeInformation",
"System.Globalization.Extensions",
"System.IO.Compression",
"System.Net.Http",
"System.Text.Encoding.CodePages",
"System.Threading.Overlapped"
};
#define IGNORED_ASM_VER(NAME, MAJOR, MINOR, BUILD, REVISION) { NAME, MAJOR, MINOR, BUILD, REVISION }
static const IgnoredAssemblyVersion ignored_assembly_versions [] = {
IGNORED_ASM_VER (SYS_GLOBALIZATION_EXT, 4, 0, 0, 0),
IGNORED_ASM_VER (SYS_GLOBALIZATION_EXT, 4, 0, 1, 0),
IGNORED_ASM_VER (SYS_GLOBALIZATION_EXT, 4, 0, 2, 0),
IGNORED_ASM_VER (SYS_GLOBALIZATION_EXT, 4, 1, 0, 0),
IGNORED_ASM_VER (SYS_IO_COMPRESSION, 4, 1, 0, 0),
IGNORED_ASM_VER (SYS_IO_COMPRESSION, 4, 1, 2, 0),
IGNORED_ASM_VER (SYS_IO_COMPRESSION, 4, 2, 0, 0),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 1, 0, 0),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 1, 0, 1),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 1, 1, 0),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 1, 1, 1),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 1, 1, 2),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 1, 1, 3),
IGNORED_ASM_VER (SYS_NET_HTTP, 4, 2, 0, 0),
IGNORED_ASM_VER (SYS_RT_INTEROP_RUNTIME_INFO, 4, 0, 0, 0),
IGNORED_ASM_VER (SYS_RT_INTEROP_RUNTIME_INFO, 4, 0, 1, 0),
IGNORED_ASM_VER (SYS_RT_INTEROP_RUNTIME_INFO, 4, 0, 2, 0),
IGNORED_ASM_VER (SYS_TEXT_ENC_CODEPAGES, 4, 0, 1, 0),
IGNORED_ASM_VER (SYS_TEXT_ENC_CODEPAGES, 4, 0, 2, 0),
IGNORED_ASM_VER (SYS_TEXT_ENC_CODEPAGES, 4, 1, 0, 0),
IGNORED_ASM_VER (SYS_TEXT_ENC_CODEPAGES, 4, 1, 1, 0),
IGNORED_ASM_VER (SYS_THREADING_OVERLAPPED, 4, 0, 0, 0),
IGNORED_ASM_VER (SYS_THREADING_OVERLAPPED, 4, 0, 1, 0),
IGNORED_ASM_VER (SYS_THREADING_OVERLAPPED, 4, 0, 2, 0),
IGNORED_ASM_VER (SYS_THREADING_OVERLAPPED, 4, 1, 0, 0)
};
#endif /* DISABLE_DESKTOP_LOADER */
gboolean
mono_assembly_is_problematic_version (const char *name, guint16 major, guint16 minor, guint16 build, guint16 revision)
{
#ifndef DISABLE_DESKTOP_LOADER
for (int i = 0; i < G_N_ELEMENTS (ignored_assembly_versions); ++i) {
if (ignored_assembly_versions [i].major != major ||
ignored_assembly_versions [i].minor != minor ||
ignored_assembly_versions [i].build != build ||
ignored_assembly_versions [i].revision != revision)
continue;
if (!strcmp (ignored_assemblies_names [ignored_assembly_versions [i].assembly_name], name))
return TRUE;
}
#endif
return FALSE;
}
/*
Equivalent C# code:
static void Main () {
......@@ -1355,27 +1183,6 @@ hash_guid (const char *str)
return h;
}
gboolean
mono_is_problematic_image (MonoImage *image)
{
#ifndef DISABLE_DESKTOP_LOADER
int h = hash_guid (image->guid);
//TODO make this more cache effiecient.
// Either sort by hash and bseach or use SoA and make the linear search more cache efficient.
for (int i = 0; i < G_N_ELEMENTS (ignored_assemblies); ++i) {
if (ignored_assemblies [i].hash == h && !strcmp (image->guid, ignored_assemblies [i].guid)) {
const char *needle = ignored_assemblies_file_names [ignored_assemblies [i].assembly_name];
size_t needle_len = strlen (needle);
size_t asm_len = strlen (image->name);
if (asm_len > needle_len && !g_ascii_strcasecmp (image->name + (asm_len - needle_len), needle))
return TRUE;
}
}
#endif
return FALSE;
}
#ifdef ENABLE_METADATA_UPDATE
static void
dump_encmap (MonoImage *image)
......@@ -1446,17 +1253,6 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
if (!mono_image_load_cli_data (image))
goto invalid_image;
if (!image->ref_only && mono_is_problematic_image (image)) {
if (image->load_from_context) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Loading problematic image %s", image->name);
} else {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Denying load of problematic image %s", image->name);
if (status)
*status = MONO_IMAGE_IMAGE_INVALID;
goto invalid_image;
}
}
if (image->loader == &pe_loader && !image->metadata_only && !mono_verifier_verify_table_data (image, error))
goto invalid_image;
......@@ -1848,7 +1644,7 @@ mono_image_get_name_with_culture_if_needed (MonoImage *image)
}
static MonoImage *
register_image (MonoLoadedImages *li, MonoImage *image, gboolean *problematic)
register_image (MonoLoadedImages *li, MonoImage *image)
{
MonoImage *image2;
char *name = image->name;
......@@ -1877,11 +1673,6 @@ register_image (MonoLoadedImages *li, MonoImage *image, gboolean *problematic)
g_hash_table_insert (loaded_images_by_name, (char *) image->assembly_name, image);
mono_images_unlock ();
if (mono_is_problematic_image (image)) {
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Registering %s, problematic image '%s'", image->ref_only ? "REFONLY" : "default", name);
if (problematic)
*problematic = TRUE;
}
g_free (name_with_culture);
return image;
}
......@@ -1926,7 +1717,7 @@ mono_image_open_from_data_internal (MonoAssemblyLoadContext *alc, char *data, gu
if (image == NULL)
return NULL;
return register_image (mono_alc_get_loaded_images (alc), image, NULL);
return register_image (mono_alc_get_loaded_images (alc), image);
}
MonoImage *
......@@ -2032,7 +1823,7 @@ mono_image_open_from_module_handle (MonoAssemblyLoadContext *alc, HMODULE module
if (image == NULL)
return NULL;
return register_image (mono_alc_get_loaded_images (alc), image, NULL);
return register_image (mono_alc_get_loaded_images (alc), image);
}
#endif
......@@ -2052,7 +1843,7 @@ mono_image_open_full (const char *fname, MonoImageOpenStatus *status, gboolean r
* via this API, and then try to load it with another culture we will return the first one.
*/
static MonoImage *
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context, gboolean *problematic)
mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
{
MonoImage *image;
GHashTable *loaded_images = mono_loaded_images_get_hash (li, refonly);
......@@ -2075,22 +1866,6 @@ mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadConte
mono_images_lock ();
image = (MonoImage*)g_hash_table_lookup (loaded_images, absfname);
if (image) { // Image already loaded
if (!load_from_context && mono_is_problematic_image (image)) {
// If we previously loaded a problematic image, don't
// return it if we're not in LoadFrom context.
//
// Note: this has an interaction with
// mono_problematic_image_reprobe - at that point we
// have a problematic image opened, but we don't want
// to see it again when we go searching for an image
// to load.
mono_images_unlock ();
if (problematic)
*problematic = TRUE;
return NULL;
}
g_assert (m_image_is_module_handle (image));
if (m_image_has_entry_point (image) && image->ref_count == 0) {
/* Increment reference count on images loaded outside of the runtime. */
......@@ -2162,21 +1937,6 @@ mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadConte
g_free (absfname);
if (image) { // Image already loaded
if (!refonly && !load_from_context && mono_is_problematic_image (image)) {
// If we previously loaded a problematic image, don't
// return it if we're not in LoadFrom context.
//
// Note: this has an interaction with
// mono_problematic_image_reprobe - at that point we
// have a problematic image opened, but we don't want
// to see it again when we go searching for an image
// to load.
mono_images_unlock ();
mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_ASSEMBLY, "Not returning problematic image '%s' refcount=%d", image->name, image->ref_count);
if (problematic)
*problematic = TRUE;
return NULL;
}
mono_image_addref (image);
mono_images_unlock ();
return image;
......@@ -2188,33 +1948,16 @@ mono_image_open_a_lot_parameterized (MonoLoadedImages *li, MonoAssemblyLoadConte
if (image == NULL)
return NULL;
return register_image (li, image, problematic);
return register_image (li, image);
}
MonoImage *
mono_image_open_a_lot (MonoAssemblyLoadContext *alc, const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
{
MonoLoadedImages *li = mono_alc_get_loaded_images (alc);
return mono_image_open_a_lot_parameterized (li, alc, fname, status, refonly, load_from_context, NULL);
return mono_image_open_a_lot_parameterized (li, alc, fname, status, refonly, load_from_context);
}
gboolean
mono_is_problematic_file (const char *fname)
{
MonoImageOpenStatus status;
gboolean problematic = FALSE;
MonoDomain *domain = mono_domain_get ();
MonoAssemblyLoadContext *alc = mono_domain_default_alc (domain);
MonoLoadedImages *li = mono_alc_get_loaded_images (alc);
MonoImage *opened = mono_image_open_a_lot_parameterized (li, alc, fname, &status, FALSE, FALSE, &problematic);
if (opened)
mono_image_close (opened);
return problematic;
}
/**
* mono_image_open:
* \param fname filename that points to the module we want to open
......
......@@ -1226,9 +1226,6 @@ mono_find_image_set_owner (void *ptr);
void
mono_loader_register_module (const char *name, MonoDl *module);
gboolean
mono_assembly_is_problematic_version (const char *name, guint16 major, guint16 minor, guint16 build, guint16 revision);
void
mono_ginst_get_desc (GString *str, MonoGenericInst *ginst);
......
......@@ -1427,13 +1427,8 @@ static void main_thread_handler (gpointer user_data)
for (i = 0; i < main_args->argc; ++i) {
assembly = mono_domain_assembly_open_internal (main_args->domain, mono_domain_default_alc (main_args->domain), main_args->argv [i]);
if (!assembly) {
if (mono_is_problematic_file (main_args->argv [i])) {
fprintf (stderr, "Info: AOT of problematic assembly %s skipped. This is expected.\n", main_args->argv [i]);
continue;
} else {
fprintf (stderr, "Can not open image %s\n", main_args->argv [i]);
exit (1);
}
fprintf (stderr, "Can not open image %s\n", main_args->argv [i]);
exit (1);
}
/* Check that the assembly loaded matches the filename */
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册