summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiseob.jang <jiseob.jang@samsung.com>2017-09-07 13:16:07 +0900
committerCHUNSEOK LEE <chunseok.lee@samsung.com>2017-09-08 11:46:55 +0900
commita27dfe2057fe9d294b784f5f5be279ed6c5d6c22 (patch)
tree47415bfdd11796c44b4447ad8a5c8ac8c171ea69
parentcb9516da9df966079e5a34490139eec68c38dafa (diff)
downloadcoreclr-a27dfe2057fe9d294b784f5f5be279ed6c5d6c22.tar.gz
coreclr-a27dfe2057fe9d294b784f5f5be279ed6c5d6c22.tar.bz2
coreclr-a27dfe2057fe9d294b784f5f5be279ed6c5d6c22.zip
Change-Id: I72c9f2b7258c576be457df609e33af55e0beab88
-rw-r--r--packaging/0001-ARM-Linux-Support-unaligned-struct-read-write-11290.patch84
-rw-r--r--packaging/0001-Add-project.assets.json-files.patch2165
-rw-r--r--packaging/0002-x86-Linux-Thread-safe-UMThunkMarshInfo-RunTimeInit-1.patch41
-rw-r--r--packaging/0003-Enable-pow-for-arm-armel-in-tryrun-11703.patch40
-rw-r--r--packaging/0004-ARM-Linux-Validate-memory-using-ldrb-instead-of-ldr.patch27
-rw-r--r--packaging/0005-Add-skipped-testcase-on-TM1.patch33
-rw-r--r--packaging/0006-Set-local-variables-as-addr-exposed-if-it-appears-in.patch49
-rw-r--r--packaging/0007-Revert-unnecessary-changes.patch34
-rw-r--r--packaging/0008-Add-skipped-testcase-superpmi.patch22
-rw-r--r--packaging/0009-x86-Linux-Adjust-SP-in-throwing-helper-block-12504-1.patch65
-rw-r--r--packaging/0010-Use-udf-0xff-instead-of-bkpt-0xbe-as-a-poison-13.patch425
-rw-r--r--packaging/0011-Enable-sosplugin-on-ARM-14.patch134
-rw-r--r--packaging/0012-Add-pie-to-linker-option-16.patch80
-rw-r--r--packaging/0013-Revert-Add-pie-to-linker-option-16.patch78
-rw-r--r--packaging/0014-Fix-inconsistency-between-GetHasCode-and-Equals-1351.patch35
-rw-r--r--packaging/0015-Cherry-pick-13586.patch170
-rw-r--r--packaging/0016-callsignalhandlerwrapper-patch.patch51
-rw-r--r--packaging/0017-clear-cache-after-NI-reloc.patch25
-rw-r--r--packaging/0018-Support-FEATURE_GDBJIT_FRAME-including-NI-IL_Stub.patch1439
-rw-r--r--packaging/0019-Add-profiling-support.patch773
-rw-r--r--packaging/0020-Enable-loading-directly-ni-file-for-dotnet-launcher.patch40
-rw-r--r--packaging/0021-Revert-Enable-loading-directly-ni-file-for-dotnet-la.patch42
-rw-r--r--packaging/0022-Enable-loading-directly-ni-file-for-corerun-temporar.patch32
-rw-r--r--packaging/0023-Add-Tizen-RuntimeID-case.patch56
-rw-r--r--packaging/coreclr-rpmlintrc2
-rw-r--r--packaging/coreclr.manifest5
-rw-r--r--packaging/coreclr.spec401
-rw-r--r--packaging/dep_libs.tar.gzbin0 -> 144494 bytes
-rw-r--r--packaging/downloaded_files.tar.gzbin0 -> 448835415 bytes
-rw-r--r--packaging/libicu.tar.gzbin0 -> 12152902 bytes
-rw-r--r--packaging/tizen-toolchain-support.patch49
31 files changed, 6397 insertions, 0 deletions
diff --git a/packaging/0001-ARM-Linux-Support-unaligned-struct-read-write-11290.patch b/packaging/0001-ARM-Linux-Support-unaligned-struct-read-write-11290.patch
new file mode 100644
index 0000000000..70f948b4eb
--- /dev/null
+++ b/packaging/0001-ARM-Linux-Support-unaligned-struct-read-write-11290.patch
@@ -0,0 +1,84 @@
+From 233bb0c8341079163acc12bea195e649f54ec5fb Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Sat, 20 May 2017 06:26:27 +0900
+Subject: [PATCH 01/23] [ARM/Linux] Support unaligned struct read/write
+ (#11290)
+
+* [ARM/Linux] Support unaligned struct read
+
+* Fix format error
+
+* Support unaligned struct write
+---
+ src/jit/importer.cpp | 15 ++++++++++-----
+ src/jit/morph.cpp | 14 ++++++++++++++
+ 2 files changed, 24 insertions(+), 5 deletions(-)
+
+diff --git a/src/jit/importer.cpp b/src/jit/importer.cpp
+index 74018c4..2d50741 100644
+--- a/src/jit/importer.cpp
++++ b/src/jit/importer.cpp
+@@ -14710,6 +14710,11 @@ void Compiler::impImportBlockCode(BasicBlock* block)
+ assertImp(varTypeIsStruct(op2));
+
+ op1 = impAssignStructPtr(op1, op2, resolvedToken.hClass, (unsigned)CHECK_SPILL_ALL);
++
++ if (op1->OperIsBlkOp() && (prefixFlags & PREFIX_UNALIGNED))
++ {
++ op1->gtFlags |= GTF_BLK_UNALIGNED;
++ }
+ goto SPILL_APPEND;
+ }
+
+@@ -14822,11 +14827,6 @@ void Compiler::impImportBlockCode(BasicBlock* block)
+ // Could point anywhere, example a boxed class static int
+ op1->gtFlags |= GTF_IND_TGTANYWHERE | GTF_GLOB_REF;
+ assertImp(varTypeIsArithmetic(op1->gtType));
+-
+- if (prefixFlags & PREFIX_UNALIGNED)
+- {
+- op1->gtFlags |= GTF_IND_UNALIGNED;
+- }
+ }
+ else
+ {
+@@ -14836,6 +14836,11 @@ void Compiler::impImportBlockCode(BasicBlock* block)
+ }
+ op1->gtFlags |= GTF_EXCEPT;
+
++ if (prefixFlags & PREFIX_UNALIGNED)
++ {
++ op1->gtFlags |= GTF_IND_UNALIGNED;
++ }
++
+ impPushOnStack(op1, tiRetVal);
+ break;
+ }
+diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp
+index 9404469..27a1dae 100644
+--- a/src/jit/morph.cpp
++++ b/src/jit/morph.cpp
+@@ -9960,6 +9960,20 @@ GenTreePtr Compiler::fgMorphCopyBlock(GenTreePtr tree)
+ requiresCopyBlock = true;
+ }
+
++#if defined(_TARGET_ARM_)
++ if ((rhs->OperIsIndir()) && (rhs->gtFlags & GTF_IND_UNALIGNED))
++ {
++ JITDUMP(" rhs is unaligned");
++ requiresCopyBlock = true;
++ }
++
++ if (asg->gtFlags & GTF_BLK_UNALIGNED)
++ {
++ JITDUMP(" asg is unaligned");
++ requiresCopyBlock = true;
++ }
++#endif // _TARGET_ARM_
++
+ if (dest->OperGet() == GT_OBJ && dest->AsBlk()->gtBlkOpGcUnsafe)
+ {
+ requiresCopyBlock = true;
+--
+1.9.1
+
diff --git a/packaging/0001-Add-project.assets.json-files.patch b/packaging/0001-Add-project.assets.json-files.patch
new file mode 100644
index 0000000000..87ee95d686
--- /dev/null
+++ b/packaging/0001-Add-project.assets.json-files.patch
@@ -0,0 +1,2165 @@
+From f4f1fe7da58f9536bece83d934433583f406b275 Mon Sep 17 00:00:00 2001
+From: dotnet <dotnet@samsung.com>
+Date: Wed, 6 Sep 2017 20:36:33 +0900
+Subject: [PATCH] Add project.assets.json files
+
+---
+ src/.nuget/init/project.assets.json | 72 +
+ src/.nuget/optdata/obj/project.assets.json | 137 ++
+ src/ToolBox/SOS/NETCore/project.assets.json | 1918 +++++++++++++++++++++++++++
+ 3 files changed, 2127 insertions(+)
+ create mode 100644 src/.nuget/init/project.assets.json
+ create mode 100644 src/.nuget/optdata/obj/project.assets.json
+ create mode 100644 src/ToolBox/SOS/NETCore/project.assets.json
+
+diff --git a/src/.nuget/init/project.assets.json b/src/.nuget/init/project.assets.json
+new file mode 100644
+index 0000000..fae7968
+--- /dev/null
++++ b/src/.nuget/init/project.assets.json
+@@ -0,0 +1,72 @@
++{
++ "version": 2,
++ "targets": {
++ ".NETCoreApp,Version=v1.0": {
++ "Microsoft.NETCore.Platforms/1.0.2-beta-24224-02": {
++ "type": "package",
++ "compile": {
++ "lib/netstandard1.0/_._": {}
++ },
++ "runtime": {
++ "lib/netstandard1.0/_._": {}
++ }
++ }
++ }
++ },
++ "libraries": {
++ "Microsoft.NETCore.Platforms/1.0.2-beta-24224-02": {
++ "sha512": "2iueL6ciB4i0waip9Y87I+bU9ObLCbucAcHfVBea2CsOeXljU5stmrqi48hgjHN/0v3Y2QAj7/6yWcjsmxpQTQ==",
++ "type": "package",
++ "path": "microsoft.netcore.platforms/1.0.2-beta-24224-02",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.0/_._",
++ "microsoft.netcore.platforms.1.0.2-beta-24224-02.nupkg.sha512",
++ "microsoft.netcore.platforms.nuspec",
++ "runtime.json"
++ ]
++ }
++ },
++ "projectFileDependencyGroups": {
++ ".NETCoreApp,Version=v1.0": [
++ "Microsoft.NETCore.Platforms >= 1.0.2-beta-24224-02"
++ ]
++ },
++ "packageFolders": {
++ "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/packages": {},
++ "/home/jang/.dotnet/NuGetFallbackFolder": {}
++ },
++ "project": {
++ "version": "2.0.0",
++ "restore": {
++ "projectUniqueName": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/.nuget/init/init.csproj",
++ "projectName": "init",
++ "projectPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/.nuget/init/init.csproj",
++ "packagesPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/packages",
++ "outputPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/.nuget/init",
++ "projectStyle": "PackageReference",
++ "originalTargetFrameworks": [
++ "netcoreapp1.0"
++ ],
++ "frameworks": {
++ "netcoreapp1.0": {
++ "projectReferences": {}
++ }
++ }
++ },
++ "frameworks": {
++ "netcoreapp1.0": {
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": {
++ "target": "Package",
++ "version": "1.0.2-beta-24224-02"
++ }
++ },
++ "imports": [
++ "portable-net45+win8"
++ ]
++ }
++ }
++ }
++}
+\ No newline at end of file
+diff --git a/src/.nuget/optdata/obj/project.assets.json b/src/.nuget/optdata/obj/project.assets.json
+new file mode 100644
+index 0000000..420e6d2
+--- /dev/null
++++ b/src/.nuget/optdata/obj/project.assets.json
+@@ -0,0 +1,137 @@
++{
++ "version": 2,
++ "targets": {
++ ".NETStandard,Version=v0.0": {
++ "optimization.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package"
++ }
++ },
++ ".NETStandard,Version=v0.0/linux-x64": {
++ "optimization.linux-x64.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package"
++ },
++ "optimization.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package",
++ "dependencies": {
++ "optimization.linux-x64.PGO.CoreCLR": "2.0.0-release-20170711-0120"
++ }
++ }
++ },
++ ".NETStandard,Version=v0.0/win7-x64": {
++ "optimization.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package",
++ "dependencies": {
++ "optimization.windows_nt-x64.PGO.CoreCLR": "2.0.0-release-20170711-0120"
++ }
++ },
++ "optimization.windows_nt-x64.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package"
++ }
++ },
++ ".NETStandard,Version=v0.0/win7-x86": {
++ "optimization.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package",
++ "dependencies": {
++ "optimization.windows_nt-x86.PGO.CoreCLR": "2.0.0-release-20170711-0120"
++ }
++ },
++ "optimization.windows_nt-x86.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "type": "package"
++ }
++ }
++ },
++ "libraries": {
++ "optimization.linux-x64.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "sha512": "UF72aFgAWLWQF3WyxKtqOrqBVQirVtO3ThT8F7dkXzVBMVOewldP/suPj3LsWm/dbllBK2B68iK5MxzcCjFhjg==",
++ "type": "package",
++ "path": "optimization.linux-x64.pgo.coreclr/2.0.0-release-20170711-0120",
++ "files": [
++ "data/clrjit.profdata",
++ "data/coreclr.profdata",
++ "optimization.linux-x64.pgo.coreclr.2.0.0-release-20170711-0120.nupkg.sha512",
++ "optimization.linux-x64.pgo.coreclr.nuspec"
++ ]
++ },
++ "optimization.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "sha512": "NdQ9KwOKBV5hZl9bUkfs+wxeqFipyXwGekMtcgmzdMnCDKrJrWsnBZs7Qk6hdd/eNqaiWR+3Y8aaezyMZrSV3w==",
++ "type": "package",
++ "path": "optimization.pgo.coreclr/2.0.0-release-20170711-0120",
++ "files": [
++ "optimization.pgo.coreclr.2.0.0-release-20170711-0120.nupkg.sha512",
++ "optimization.pgo.coreclr.nuspec",
++ "runtime.json"
++ ]
++ },
++ "optimization.windows_nt-x64.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "sha512": "EYs0GI6T/lcIrumS6hS6wj5KAgFOqJoW+ardG40/h+h42wru0ZLzuZ7j+DjoDwx6Hu3OsLqmamcrNsk139uw9g==",
++ "type": "package",
++ "path": "optimization.windows_nt-x64.pgo.coreclr/2.0.0-release-20170711-0120",
++ "files": [
++ "data/clrjit.pgd",
++ "data/coreclr.pgd",
++ "optimization.windows_nt-x64.pgo.coreclr.2.0.0-release-20170711-0120.nupkg.sha512",
++ "optimization.windows_nt-x64.pgo.coreclr.nuspec"
++ ]
++ },
++ "optimization.windows_nt-x86.PGO.CoreCLR/2.0.0-release-20170711-0120": {
++ "sha512": "4DEwZ1gZ8QU5yhwaE8H559v8HkCJVT9RftTEdVBT1C/8n+JWoplFlEyNlXOMpsv+7N00yTWSybkW1XGlwpjJzg==",
++ "type": "package",
++ "path": "optimization.windows_nt-x86.pgo.coreclr/2.0.0-release-20170711-0120",
++ "files": [
++ "data/clrjit.pgd",
++ "data/coreclr.pgd",
++ "optimization.windows_nt-x86.pgo.coreclr.2.0.0-release-20170711-0120.nupkg.sha512",
++ "optimization.windows_nt-x86.pgo.coreclr.nuspec"
++ ]
++ }
++ },
++ "projectFileDependencyGroups": {
++ ".NETStandard,Version=v0.0": [
++ "optimization.PGO.CoreCLR >= 2.0.0-release-20170711-0120"
++ ]
++ },
++ "packageFolders": {
++ "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/packages": {},
++ "/home/jang/.dotnet/NuGetFallbackFolder": {}
++ },
++ "project": {
++ "version": "2.0.0",
++ "restore": {
++ "projectUniqueName": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/.nuget/optdata/optdata.csproj",
++ "projectName": "optdata",
++ "projectPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/.nuget/optdata/optdata.csproj",
++ "packagesPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/packages",
++ "outputPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/.nuget/optdata/obj/",
++ "projectStyle": "PackageReference",
++ "originalTargetFrameworks": [
++ "netstandard"
++ ],
++ "frameworks": {
++ "netstandard": {
++ "projectReferences": {}
++ }
++ }
++ },
++ "frameworks": {
++ "netstandard": {
++ "dependencies": {
++ "optimization.PGO.CoreCLR": {
++ "target": "Package",
++ "version": "2.0.0-release-20170711-0120"
++ }
++ }
++ }
++ },
++ "runtimes": {
++ "linux-x64": {
++ "#import": []
++ },
++ "win7-x64": {
++ "#import": []
++ },
++ "win7-x86": {
++ "#import": []
++ }
++ }
++ }
++}
+\ No newline at end of file
+diff --git a/src/ToolBox/SOS/NETCore/project.assets.json b/src/ToolBox/SOS/NETCore/project.assets.json
+new file mode 100644
+index 0000000..316de64
+--- /dev/null
++++ b/src/ToolBox/SOS/NETCore/project.assets.json
+@@ -0,0 +1,1918 @@
++{
++ "version": 2,
++ "targets": {
++ ".NETCoreApp,Version=v4.0": {
++ "Microsoft.NETCore.Platforms/1.0.2-beta-24224-02": {
++ "type": "package",
++ "compile": {
++ "lib/netstandard1.0/_._": {}
++ },
++ "runtime": {
++ "lib/netstandard1.0/_._": {}
++ }
++ },
++ "Microsoft.NETCore.Targets/1.1.0": {
++ "type": "package",
++ "compile": {
++ "lib/netstandard1.0/_._": {}
++ },
++ "runtime": {
++ "lib/netstandard1.0/_._": {}
++ }
++ },
++ "runtime.native.System/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0"
++ },
++ "compile": {
++ "lib/netstandard1.0/_._": {}
++ },
++ "runtime": {
++ "lib/netstandard1.0/_._": {}
++ }
++ },
++ "runtime.native.System.IO.Compression/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0"
++ },
++ "compile": {
++ "lib/netstandard1.0/_._": {}
++ },
++ "runtime": {
++ "lib/netstandard1.0/_._": {}
++ }
++ },
++ "System.Buffers/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "System.Diagnostics.Debug": "4.3.0",
++ "System.Diagnostics.Tracing": "4.3.0",
++ "System.Resources.ResourceManager": "4.3.0",
++ "System.Runtime": "4.3.0",
++ "System.Threading": "4.3.0"
++ },
++ "compile": {
++ "lib/netstandard1.1/_._": {}
++ },
++ "runtime": {
++ "lib/netstandard1.1/System.Buffers.dll": {}
++ }
++ },
++ "System.Collections/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Collections.dll": {}
++ }
++ },
++ "System.Collections.Immutable/1.3.0": {
++ "type": "package",
++ "dependencies": {
++ "System.Collections": "4.3.0",
++ "System.Diagnostics.Debug": "4.3.0",
++ "System.Globalization": "4.3.0",
++ "System.Linq": "4.3.0",
++ "System.Resources.ResourceManager": "4.3.0",
++ "System.Runtime": "4.3.0",
++ "System.Runtime.Extensions": "4.3.0",
++ "System.Threading": "4.3.0"
++ },
++ "compile": {
++ "lib/netstandard1.0/System.Collections.Immutable.dll": {}
++ },
++ "runtime": {
++ "lib/netstandard1.0/System.Collections.Immutable.dll": {}
++ }
++ },
++ "System.Diagnostics.Debug/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Diagnostics.Debug.dll": {}
++ }
++ },
++ "System.Diagnostics.Tracing/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.5/_._": {}
++ }
++ },
++ "System.Globalization/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Globalization.dll": {}
++ }
++ },
++ "System.IO/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0",
++ "System.Text.Encoding": "4.3.0",
++ "System.Threading.Tasks": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.5/System.IO.dll": {}
++ }
++ },
++ "System.IO.Compression/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "System.Buffers": "4.3.0",
++ "System.Collections": "4.3.0",
++ "System.Diagnostics.Debug": "4.3.0",
++ "System.IO": "4.3.0",
++ "System.Resources.ResourceManager": "4.3.0",
++ "System.Runtime": "4.3.0",
++ "System.Runtime.Extensions": "4.3.0",
++ "System.Runtime.Handles": "4.3.0",
++ "System.Runtime.InteropServices": "4.3.0",
++ "System.Text.Encoding": "4.3.0",
++ "System.Threading": "4.3.0",
++ "System.Threading.Tasks": "4.3.0",
++ "runtime.native.System": "4.3.0",
++ "runtime.native.System.IO.Compression": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.IO.Compression.dll": {}
++ },
++ "runtimeTargets": {
++ "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll": {
++ "assetType": "runtime",
++ "rid": "unix"
++ },
++ "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll": {
++ "assetType": "runtime",
++ "rid": "win"
++ }
++ }
++ },
++ "System.IO.FileSystem/4.0.1": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.0.1",
++ "Microsoft.NETCore.Targets": "1.0.1",
++ "System.IO": "4.1.0",
++ "System.IO.FileSystem.Primitives": "4.0.1",
++ "System.Runtime": "4.1.0",
++ "System.Runtime.Handles": "4.0.1",
++ "System.Text.Encoding": "4.0.11",
++ "System.Threading.Tasks": "4.0.11"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.IO.FileSystem.dll": {}
++ }
++ },
++ "System.IO.FileSystem.Primitives/4.0.1": {
++ "type": "package",
++ "dependencies": {
++ "System.Runtime": "4.1.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": {}
++ },
++ "runtime": {
++ "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {}
++ }
++ },
++ "System.Linq/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "System.Collections": "4.3.0",
++ "System.Diagnostics.Debug": "4.3.0",
++ "System.Resources.ResourceManager": "4.3.0",
++ "System.Runtime": "4.3.0",
++ "System.Runtime.Extensions": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.6/System.Linq.dll": {}
++ },
++ "runtime": {
++ "lib/netstandard1.6/System.Linq.dll": {}
++ }
++ },
++ "System.Reflection/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.IO": "4.3.0",
++ "System.Reflection.Primitives": "4.3.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.5/System.Reflection.dll": {}
++ }
++ },
++ "System.Reflection.Extensions/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Reflection": "4.3.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.0/System.Reflection.Extensions.dll": {}
++ }
++ },
++ "System.Reflection.Metadata/1.4.1": {
++ "type": "package",
++ "dependencies": {
++ "System.Collections": "4.3.0",
++ "System.Collections.Immutable": "1.3.0",
++ "System.Diagnostics.Debug": "4.3.0",
++ "System.IO": "4.3.0",
++ "System.IO.Compression": "4.3.0",
++ "System.Linq": "4.3.0",
++ "System.Reflection": "4.3.0",
++ "System.Reflection.Extensions": "4.3.0",
++ "System.Reflection.Primitives": "4.3.0",
++ "System.Resources.ResourceManager": "4.3.0",
++ "System.Runtime": "4.3.0",
++ "System.Runtime.Extensions": "4.3.0",
++ "System.Runtime.InteropServices": "4.3.0",
++ "System.Text.Encoding": "4.3.0",
++ "System.Text.Encoding.Extensions": "4.3.0",
++ "System.Threading": "4.3.0"
++ },
++ "compile": {
++ "lib/netstandard1.1/System.Reflection.Metadata.dll": {}
++ },
++ "runtime": {
++ "lib/netstandard1.1/System.Reflection.Metadata.dll": {}
++ }
++ },
++ "System.Reflection.Primitives/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.0/System.Reflection.Primitives.dll": {}
++ }
++ },
++ "System.Resources.ResourceManager/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Globalization": "4.3.0",
++ "System.Reflection": "4.3.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.0/System.Resources.ResourceManager.dll": {}
++ }
++ },
++ "System.Runtime/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0"
++ },
++ "compile": {
++ "ref/netstandard1.5/System.Runtime.dll": {}
++ }
++ },
++ "System.Runtime.Extensions/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.5/System.Runtime.Extensions.dll": {}
++ }
++ },
++ "System.Runtime.Handles/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Runtime.Handles.dll": {}
++ }
++ },
++ "System.Runtime.InteropServices/4.1.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.0.1",
++ "Microsoft.NETCore.Targets": "1.0.1",
++ "System.Reflection": "4.1.0",
++ "System.Reflection.Primitives": "4.0.1",
++ "System.Runtime": "4.1.0",
++ "System.Runtime.Handles": "4.0.1"
++ },
++ "compile": {
++ "ref/netstandard1.5/System.Runtime.InteropServices.dll": {}
++ }
++ },
++ "System.Text.Encoding/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Text.Encoding.dll": {}
++ }
++ },
++ "System.Text.Encoding.Extensions/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0",
++ "System.Text.Encoding": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": {}
++ }
++ },
++ "System.Threading/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "System.Runtime": "4.3.0",
++ "System.Threading.Tasks": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Threading.dll": {}
++ },
++ "runtime": {
++ "lib/netstandard1.3/System.Threading.dll": {}
++ }
++ },
++ "System.Threading.Tasks/4.3.0": {
++ "type": "package",
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": "1.1.0",
++ "Microsoft.NETCore.Targets": "1.1.0",
++ "System.Runtime": "4.3.0"
++ },
++ "compile": {
++ "ref/netstandard1.3/System.Threading.Tasks.dll": {}
++ }
++ }
++ }
++ },
++ "libraries": {
++ "Microsoft.NETCore.Platforms/1.0.2-beta-24224-02": {
++ "sha512": "2iueL6ciB4i0waip9Y87I+bU9ObLCbucAcHfVBea2CsOeXljU5stmrqi48hgjHN/0v3Y2QAj7/6yWcjsmxpQTQ==",
++ "type": "package",
++ "path": "microsoft.netcore.platforms/1.0.2-beta-24224-02",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.0/_._",
++ "microsoft.netcore.platforms.1.0.2-beta-24224-02.nupkg.sha512",
++ "microsoft.netcore.platforms.nuspec",
++ "runtime.json"
++ ]
++ },
++ "Microsoft.NETCore.Targets/1.1.0": {
++ "sha512": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==",
++ "type": "package",
++ "path": "microsoft.netcore.targets/1.1.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.0/_._",
++ "microsoft.netcore.targets.1.1.0.nupkg.sha512",
++ "microsoft.netcore.targets.nuspec",
++ "runtime.json"
++ ]
++ },
++ "runtime.native.System/4.3.0": {
++ "sha512": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
++ "type": "package",
++ "path": "runtime.native.system/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.0/_._",
++ "runtime.native.system.4.3.0.nupkg.sha512",
++ "runtime.native.system.nuspec"
++ ]
++ },
++ "runtime.native.System.IO.Compression/4.3.0": {
++ "sha512": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==",
++ "type": "package",
++ "path": "runtime.native.system.io.compression/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.0/_._",
++ "runtime.native.system.io.compression.4.3.0.nupkg.sha512",
++ "runtime.native.system.io.compression.nuspec"
++ ]
++ },
++ "System.Buffers/4.3.0": {
++ "sha512": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==",
++ "type": "package",
++ "path": "system.buffers/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.1/.xml",
++ "lib/netstandard1.1/System.Buffers.dll",
++ "system.buffers.4.3.0.nupkg.sha512",
++ "system.buffers.nuspec"
++ ]
++ },
++ "System.Collections/4.3.0": {
++ "sha512": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
++ "type": "package",
++ "path": "system.collections/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Collections.dll",
++ "ref/netcore50/System.Collections.xml",
++ "ref/netcore50/de/System.Collections.xml",
++ "ref/netcore50/es/System.Collections.xml",
++ "ref/netcore50/fr/System.Collections.xml",
++ "ref/netcore50/it/System.Collections.xml",
++ "ref/netcore50/ja/System.Collections.xml",
++ "ref/netcore50/ko/System.Collections.xml",
++ "ref/netcore50/ru/System.Collections.xml",
++ "ref/netcore50/zh-hans/System.Collections.xml",
++ "ref/netcore50/zh-hant/System.Collections.xml",
++ "ref/netstandard1.0/System.Collections.dll",
++ "ref/netstandard1.0/System.Collections.xml",
++ "ref/netstandard1.0/de/System.Collections.xml",
++ "ref/netstandard1.0/es/System.Collections.xml",
++ "ref/netstandard1.0/fr/System.Collections.xml",
++ "ref/netstandard1.0/it/System.Collections.xml",
++ "ref/netstandard1.0/ja/System.Collections.xml",
++ "ref/netstandard1.0/ko/System.Collections.xml",
++ "ref/netstandard1.0/ru/System.Collections.xml",
++ "ref/netstandard1.0/zh-hans/System.Collections.xml",
++ "ref/netstandard1.0/zh-hant/System.Collections.xml",
++ "ref/netstandard1.3/System.Collections.dll",
++ "ref/netstandard1.3/System.Collections.xml",
++ "ref/netstandard1.3/de/System.Collections.xml",
++ "ref/netstandard1.3/es/System.Collections.xml",
++ "ref/netstandard1.3/fr/System.Collections.xml",
++ "ref/netstandard1.3/it/System.Collections.xml",
++ "ref/netstandard1.3/ja/System.Collections.xml",
++ "ref/netstandard1.3/ko/System.Collections.xml",
++ "ref/netstandard1.3/ru/System.Collections.xml",
++ "ref/netstandard1.3/zh-hans/System.Collections.xml",
++ "ref/netstandard1.3/zh-hant/System.Collections.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.collections.4.3.0.nupkg.sha512",
++ "system.collections.nuspec"
++ ]
++ },
++ "System.Collections.Immutable/1.3.0": {
++ "sha512": "zukBRPUuNxwy9m4TGWLxKAnoiMc9+B+8VXeXVyPiBPvOd7yLgAlZ1DlsRWJjMx4VsvhhF2+6q6kO2GRbPja6hA==",
++ "type": "package",
++ "path": "system.collections.immutable/1.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.0/System.Collections.Immutable.dll",
++ "lib/netstandard1.0/System.Collections.Immutable.xml",
++ "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll",
++ "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml",
++ "system.collections.immutable.1.3.0.nupkg.sha512",
++ "system.collections.immutable.nuspec"
++ ]
++ },
++ "System.Diagnostics.Debug/4.3.0": {
++ "sha512": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
++ "type": "package",
++ "path": "system.diagnostics.debug/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Diagnostics.Debug.dll",
++ "ref/netcore50/System.Diagnostics.Debug.xml",
++ "ref/netcore50/de/System.Diagnostics.Debug.xml",
++ "ref/netcore50/es/System.Diagnostics.Debug.xml",
++ "ref/netcore50/fr/System.Diagnostics.Debug.xml",
++ "ref/netcore50/it/System.Diagnostics.Debug.xml",
++ "ref/netcore50/ja/System.Diagnostics.Debug.xml",
++ "ref/netcore50/ko/System.Diagnostics.Debug.xml",
++ "ref/netcore50/ru/System.Diagnostics.Debug.xml",
++ "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml",
++ "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/System.Diagnostics.Debug.dll",
++ "ref/netstandard1.0/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/de/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/es/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/it/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/System.Diagnostics.Debug.dll",
++ "ref/netstandard1.3/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/de/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/es/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/it/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml",
++ "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.diagnostics.debug.4.3.0.nupkg.sha512",
++ "system.diagnostics.debug.nuspec"
++ ]
++ },
++ "System.Diagnostics.Tracing/4.3.0": {
++ "sha512": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
++ "type": "package",
++ "path": "system.diagnostics.tracing/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net462/System.Diagnostics.Tracing.dll",
++ "lib/portable-net45+win8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net462/System.Diagnostics.Tracing.dll",
++ "ref/netcore50/System.Diagnostics.Tracing.dll",
++ "ref/netcore50/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/de/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/es/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/fr/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/it/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/ja/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/ko/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/ru/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml",
++ "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/System.Diagnostics.Tracing.dll",
++ "ref/netstandard1.1/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/System.Diagnostics.Tracing.dll",
++ "ref/netstandard1.2/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/System.Diagnostics.Tracing.dll",
++ "ref/netstandard1.3/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/System.Diagnostics.Tracing.dll",
++ "ref/netstandard1.5/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml",
++ "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml",
++ "ref/portable-net45+win8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.diagnostics.tracing.4.3.0.nupkg.sha512",
++ "system.diagnostics.tracing.nuspec"
++ ]
++ },
++ "System.Globalization/4.3.0": {
++ "sha512": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
++ "type": "package",
++ "path": "system.globalization/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Globalization.dll",
++ "ref/netcore50/System.Globalization.xml",
++ "ref/netcore50/de/System.Globalization.xml",
++ "ref/netcore50/es/System.Globalization.xml",
++ "ref/netcore50/fr/System.Globalization.xml",
++ "ref/netcore50/it/System.Globalization.xml",
++ "ref/netcore50/ja/System.Globalization.xml",
++ "ref/netcore50/ko/System.Globalization.xml",
++ "ref/netcore50/ru/System.Globalization.xml",
++ "ref/netcore50/zh-hans/System.Globalization.xml",
++ "ref/netcore50/zh-hant/System.Globalization.xml",
++ "ref/netstandard1.0/System.Globalization.dll",
++ "ref/netstandard1.0/System.Globalization.xml",
++ "ref/netstandard1.0/de/System.Globalization.xml",
++ "ref/netstandard1.0/es/System.Globalization.xml",
++ "ref/netstandard1.0/fr/System.Globalization.xml",
++ "ref/netstandard1.0/it/System.Globalization.xml",
++ "ref/netstandard1.0/ja/System.Globalization.xml",
++ "ref/netstandard1.0/ko/System.Globalization.xml",
++ "ref/netstandard1.0/ru/System.Globalization.xml",
++ "ref/netstandard1.0/zh-hans/System.Globalization.xml",
++ "ref/netstandard1.0/zh-hant/System.Globalization.xml",
++ "ref/netstandard1.3/System.Globalization.dll",
++ "ref/netstandard1.3/System.Globalization.xml",
++ "ref/netstandard1.3/de/System.Globalization.xml",
++ "ref/netstandard1.3/es/System.Globalization.xml",
++ "ref/netstandard1.3/fr/System.Globalization.xml",
++ "ref/netstandard1.3/it/System.Globalization.xml",
++ "ref/netstandard1.3/ja/System.Globalization.xml",
++ "ref/netstandard1.3/ko/System.Globalization.xml",
++ "ref/netstandard1.3/ru/System.Globalization.xml",
++ "ref/netstandard1.3/zh-hans/System.Globalization.xml",
++ "ref/netstandard1.3/zh-hant/System.Globalization.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.globalization.4.3.0.nupkg.sha512",
++ "system.globalization.nuspec"
++ ]
++ },
++ "System.IO/4.3.0": {
++ "sha512": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
++ "type": "package",
++ "path": "system.io/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net462/System.IO.dll",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net462/System.IO.dll",
++ "ref/netcore50/System.IO.dll",
++ "ref/netcore50/System.IO.xml",
++ "ref/netcore50/de/System.IO.xml",
++ "ref/netcore50/es/System.IO.xml",
++ "ref/netcore50/fr/System.IO.xml",
++ "ref/netcore50/it/System.IO.xml",
++ "ref/netcore50/ja/System.IO.xml",
++ "ref/netcore50/ko/System.IO.xml",
++ "ref/netcore50/ru/System.IO.xml",
++ "ref/netcore50/zh-hans/System.IO.xml",
++ "ref/netcore50/zh-hant/System.IO.xml",
++ "ref/netstandard1.0/System.IO.dll",
++ "ref/netstandard1.0/System.IO.xml",
++ "ref/netstandard1.0/de/System.IO.xml",
++ "ref/netstandard1.0/es/System.IO.xml",
++ "ref/netstandard1.0/fr/System.IO.xml",
++ "ref/netstandard1.0/it/System.IO.xml",
++ "ref/netstandard1.0/ja/System.IO.xml",
++ "ref/netstandard1.0/ko/System.IO.xml",
++ "ref/netstandard1.0/ru/System.IO.xml",
++ "ref/netstandard1.0/zh-hans/System.IO.xml",
++ "ref/netstandard1.0/zh-hant/System.IO.xml",
++ "ref/netstandard1.3/System.IO.dll",
++ "ref/netstandard1.3/System.IO.xml",
++ "ref/netstandard1.3/de/System.IO.xml",
++ "ref/netstandard1.3/es/System.IO.xml",
++ "ref/netstandard1.3/fr/System.IO.xml",
++ "ref/netstandard1.3/it/System.IO.xml",
++ "ref/netstandard1.3/ja/System.IO.xml",
++ "ref/netstandard1.3/ko/System.IO.xml",
++ "ref/netstandard1.3/ru/System.IO.xml",
++ "ref/netstandard1.3/zh-hans/System.IO.xml",
++ "ref/netstandard1.3/zh-hant/System.IO.xml",
++ "ref/netstandard1.5/System.IO.dll",
++ "ref/netstandard1.5/System.IO.xml",
++ "ref/netstandard1.5/de/System.IO.xml",
++ "ref/netstandard1.5/es/System.IO.xml",
++ "ref/netstandard1.5/fr/System.IO.xml",
++ "ref/netstandard1.5/it/System.IO.xml",
++ "ref/netstandard1.5/ja/System.IO.xml",
++ "ref/netstandard1.5/ko/System.IO.xml",
++ "ref/netstandard1.5/ru/System.IO.xml",
++ "ref/netstandard1.5/zh-hans/System.IO.xml",
++ "ref/netstandard1.5/zh-hant/System.IO.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.io.4.3.0.nupkg.sha512",
++ "system.io.nuspec"
++ ]
++ },
++ "System.IO.Compression/4.3.0": {
++ "sha512": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==",
++ "type": "package",
++ "path": "system.io.compression/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net46/System.IO.Compression.dll",
++ "lib/portable-net45+win8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net46/System.IO.Compression.dll",
++ "ref/netcore50/System.IO.Compression.dll",
++ "ref/netcore50/System.IO.Compression.xml",
++ "ref/netcore50/de/System.IO.Compression.xml",
++ "ref/netcore50/es/System.IO.Compression.xml",
++ "ref/netcore50/fr/System.IO.Compression.xml",
++ "ref/netcore50/it/System.IO.Compression.xml",
++ "ref/netcore50/ja/System.IO.Compression.xml",
++ "ref/netcore50/ko/System.IO.Compression.xml",
++ "ref/netcore50/ru/System.IO.Compression.xml",
++ "ref/netcore50/zh-hans/System.IO.Compression.xml",
++ "ref/netcore50/zh-hant/System.IO.Compression.xml",
++ "ref/netstandard1.1/System.IO.Compression.dll",
++ "ref/netstandard1.1/System.IO.Compression.xml",
++ "ref/netstandard1.1/de/System.IO.Compression.xml",
++ "ref/netstandard1.1/es/System.IO.Compression.xml",
++ "ref/netstandard1.1/fr/System.IO.Compression.xml",
++ "ref/netstandard1.1/it/System.IO.Compression.xml",
++ "ref/netstandard1.1/ja/System.IO.Compression.xml",
++ "ref/netstandard1.1/ko/System.IO.Compression.xml",
++ "ref/netstandard1.1/ru/System.IO.Compression.xml",
++ "ref/netstandard1.1/zh-hans/System.IO.Compression.xml",
++ "ref/netstandard1.1/zh-hant/System.IO.Compression.xml",
++ "ref/netstandard1.3/System.IO.Compression.dll",
++ "ref/netstandard1.3/System.IO.Compression.xml",
++ "ref/netstandard1.3/de/System.IO.Compression.xml",
++ "ref/netstandard1.3/es/System.IO.Compression.xml",
++ "ref/netstandard1.3/fr/System.IO.Compression.xml",
++ "ref/netstandard1.3/it/System.IO.Compression.xml",
++ "ref/netstandard1.3/ja/System.IO.Compression.xml",
++ "ref/netstandard1.3/ko/System.IO.Compression.xml",
++ "ref/netstandard1.3/ru/System.IO.Compression.xml",
++ "ref/netstandard1.3/zh-hans/System.IO.Compression.xml",
++ "ref/netstandard1.3/zh-hant/System.IO.Compression.xml",
++ "ref/portable-net45+win8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll",
++ "runtimes/win/lib/net46/System.IO.Compression.dll",
++ "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll",
++ "system.io.compression.4.3.0.nupkg.sha512",
++ "system.io.compression.nuspec"
++ ]
++ },
++ "System.IO.FileSystem/4.0.1": {
++ "sha512": "IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==",
++ "type": "package",
++ "path": "system.io.filesystem/4.0.1",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net46/System.IO.FileSystem.dll",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net46/System.IO.FileSystem.dll",
++ "ref/netstandard1.3/System.IO.FileSystem.dll",
++ "ref/netstandard1.3/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/de/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/es/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/fr/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/it/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/ja/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/ko/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/ru/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml",
++ "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.io.filesystem.4.0.1.nupkg.sha512",
++ "system.io.filesystem.nuspec"
++ ]
++ },
++ "System.IO.FileSystem.Primitives/4.0.1": {
++ "sha512": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==",
++ "type": "package",
++ "path": "system.io.filesystem.primitives/4.0.1",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net46/System.IO.FileSystem.Primitives.dll",
++ "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net46/System.IO.FileSystem.Primitives.dll",
++ "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll",
++ "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml",
++ "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.io.filesystem.primitives.4.0.1.nupkg.sha512",
++ "system.io.filesystem.primitives.nuspec"
++ ]
++ },
++ "System.Linq/4.3.0": {
++ "sha512": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==",
++ "type": "package",
++ "path": "system.linq/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net463/System.Linq.dll",
++ "lib/netcore50/System.Linq.dll",
++ "lib/netstandard1.6/System.Linq.dll",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net463/System.Linq.dll",
++ "ref/netcore50/System.Linq.dll",
++ "ref/netcore50/System.Linq.xml",
++ "ref/netcore50/de/System.Linq.xml",
++ "ref/netcore50/es/System.Linq.xml",
++ "ref/netcore50/fr/System.Linq.xml",
++ "ref/netcore50/it/System.Linq.xml",
++ "ref/netcore50/ja/System.Linq.xml",
++ "ref/netcore50/ko/System.Linq.xml",
++ "ref/netcore50/ru/System.Linq.xml",
++ "ref/netcore50/zh-hans/System.Linq.xml",
++ "ref/netcore50/zh-hant/System.Linq.xml",
++ "ref/netstandard1.0/System.Linq.dll",
++ "ref/netstandard1.0/System.Linq.xml",
++ "ref/netstandard1.0/de/System.Linq.xml",
++ "ref/netstandard1.0/es/System.Linq.xml",
++ "ref/netstandard1.0/fr/System.Linq.xml",
++ "ref/netstandard1.0/it/System.Linq.xml",
++ "ref/netstandard1.0/ja/System.Linq.xml",
++ "ref/netstandard1.0/ko/System.Linq.xml",
++ "ref/netstandard1.0/ru/System.Linq.xml",
++ "ref/netstandard1.0/zh-hans/System.Linq.xml",
++ "ref/netstandard1.0/zh-hant/System.Linq.xml",
++ "ref/netstandard1.6/System.Linq.dll",
++ "ref/netstandard1.6/System.Linq.xml",
++ "ref/netstandard1.6/de/System.Linq.xml",
++ "ref/netstandard1.6/es/System.Linq.xml",
++ "ref/netstandard1.6/fr/System.Linq.xml",
++ "ref/netstandard1.6/it/System.Linq.xml",
++ "ref/netstandard1.6/ja/System.Linq.xml",
++ "ref/netstandard1.6/ko/System.Linq.xml",
++ "ref/netstandard1.6/ru/System.Linq.xml",
++ "ref/netstandard1.6/zh-hans/System.Linq.xml",
++ "ref/netstandard1.6/zh-hant/System.Linq.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.linq.4.3.0.nupkg.sha512",
++ "system.linq.nuspec"
++ ]
++ },
++ "System.Reflection/4.3.0": {
++ "sha512": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
++ "type": "package",
++ "path": "system.reflection/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net462/System.Reflection.dll",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net462/System.Reflection.dll",
++ "ref/netcore50/System.Reflection.dll",
++ "ref/netcore50/System.Reflection.xml",
++ "ref/netcore50/de/System.Reflection.xml",
++ "ref/netcore50/es/System.Reflection.xml",
++ "ref/netcore50/fr/System.Reflection.xml",
++ "ref/netcore50/it/System.Reflection.xml",
++ "ref/netcore50/ja/System.Reflection.xml",
++ "ref/netcore50/ko/System.Reflection.xml",
++ "ref/netcore50/ru/System.Reflection.xml",
++ "ref/netcore50/zh-hans/System.Reflection.xml",
++ "ref/netcore50/zh-hant/System.Reflection.xml",
++ "ref/netstandard1.0/System.Reflection.dll",
++ "ref/netstandard1.0/System.Reflection.xml",
++ "ref/netstandard1.0/de/System.Reflection.xml",
++ "ref/netstandard1.0/es/System.Reflection.xml",
++ "ref/netstandard1.0/fr/System.Reflection.xml",
++ "ref/netstandard1.0/it/System.Reflection.xml",
++ "ref/netstandard1.0/ja/System.Reflection.xml",
++ "ref/netstandard1.0/ko/System.Reflection.xml",
++ "ref/netstandard1.0/ru/System.Reflection.xml",
++ "ref/netstandard1.0/zh-hans/System.Reflection.xml",
++ "ref/netstandard1.0/zh-hant/System.Reflection.xml",
++ "ref/netstandard1.3/System.Reflection.dll",
++ "ref/netstandard1.3/System.Reflection.xml",
++ "ref/netstandard1.3/de/System.Reflection.xml",
++ "ref/netstandard1.3/es/System.Reflection.xml",
++ "ref/netstandard1.3/fr/System.Reflection.xml",
++ "ref/netstandard1.3/it/System.Reflection.xml",
++ "ref/netstandard1.3/ja/System.Reflection.xml",
++ "ref/netstandard1.3/ko/System.Reflection.xml",
++ "ref/netstandard1.3/ru/System.Reflection.xml",
++ "ref/netstandard1.3/zh-hans/System.Reflection.xml",
++ "ref/netstandard1.3/zh-hant/System.Reflection.xml",
++ "ref/netstandard1.5/System.Reflection.dll",
++ "ref/netstandard1.5/System.Reflection.xml",
++ "ref/netstandard1.5/de/System.Reflection.xml",
++ "ref/netstandard1.5/es/System.Reflection.xml",
++ "ref/netstandard1.5/fr/System.Reflection.xml",
++ "ref/netstandard1.5/it/System.Reflection.xml",
++ "ref/netstandard1.5/ja/System.Reflection.xml",
++ "ref/netstandard1.5/ko/System.Reflection.xml",
++ "ref/netstandard1.5/ru/System.Reflection.xml",
++ "ref/netstandard1.5/zh-hans/System.Reflection.xml",
++ "ref/netstandard1.5/zh-hant/System.Reflection.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.reflection.4.3.0.nupkg.sha512",
++ "system.reflection.nuspec"
++ ]
++ },
++ "System.Reflection.Extensions/4.3.0": {
++ "sha512": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==",
++ "type": "package",
++ "path": "system.reflection.extensions/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Reflection.Extensions.dll",
++ "ref/netcore50/System.Reflection.Extensions.xml",
++ "ref/netcore50/de/System.Reflection.Extensions.xml",
++ "ref/netcore50/es/System.Reflection.Extensions.xml",
++ "ref/netcore50/fr/System.Reflection.Extensions.xml",
++ "ref/netcore50/it/System.Reflection.Extensions.xml",
++ "ref/netcore50/ja/System.Reflection.Extensions.xml",
++ "ref/netcore50/ko/System.Reflection.Extensions.xml",
++ "ref/netcore50/ru/System.Reflection.Extensions.xml",
++ "ref/netcore50/zh-hans/System.Reflection.Extensions.xml",
++ "ref/netcore50/zh-hant/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/System.Reflection.Extensions.dll",
++ "ref/netstandard1.0/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/de/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/es/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/fr/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/it/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/ja/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/ko/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/ru/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/zh-hans/System.Reflection.Extensions.xml",
++ "ref/netstandard1.0/zh-hant/System.Reflection.Extensions.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.reflection.extensions.4.3.0.nupkg.sha512",
++ "system.reflection.extensions.nuspec"
++ ]
++ },
++ "System.Reflection.Metadata/1.4.1": {
++ "sha512": "tc2ZyJgweHCLci5oQGuhQn9TD0Ii9DReXkHtZm3aAGp8xe40rpRjiTbMXOtZU+fr0BOQ46goE9+qIqRGjR9wGg==",
++ "type": "package",
++ "path": "system.reflection.metadata/1.4.1",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/netstandard1.1/System.Reflection.Metadata.dll",
++ "lib/netstandard1.1/System.Reflection.Metadata.xml",
++ "lib/portable-net45+win8/System.Reflection.Metadata.dll",
++ "lib/portable-net45+win8/System.Reflection.Metadata.xml",
++ "system.reflection.metadata.1.4.1.nupkg.sha512",
++ "system.reflection.metadata.nuspec"
++ ]
++ },
++ "System.Reflection.Primitives/4.3.0": {
++ "sha512": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
++ "type": "package",
++ "path": "system.reflection.primitives/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Reflection.Primitives.dll",
++ "ref/netcore50/System.Reflection.Primitives.xml",
++ "ref/netcore50/de/System.Reflection.Primitives.xml",
++ "ref/netcore50/es/System.Reflection.Primitives.xml",
++ "ref/netcore50/fr/System.Reflection.Primitives.xml",
++ "ref/netcore50/it/System.Reflection.Primitives.xml",
++ "ref/netcore50/ja/System.Reflection.Primitives.xml",
++ "ref/netcore50/ko/System.Reflection.Primitives.xml",
++ "ref/netcore50/ru/System.Reflection.Primitives.xml",
++ "ref/netcore50/zh-hans/System.Reflection.Primitives.xml",
++ "ref/netcore50/zh-hant/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/System.Reflection.Primitives.dll",
++ "ref/netstandard1.0/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/de/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/es/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/fr/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/it/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/ja/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/ko/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/ru/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml",
++ "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.reflection.primitives.4.3.0.nupkg.sha512",
++ "system.reflection.primitives.nuspec"
++ ]
++ },
++ "System.Resources.ResourceManager/4.3.0": {
++ "sha512": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
++ "type": "package",
++ "path": "system.resources.resourcemanager/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Resources.ResourceManager.dll",
++ "ref/netcore50/System.Resources.ResourceManager.xml",
++ "ref/netcore50/de/System.Resources.ResourceManager.xml",
++ "ref/netcore50/es/System.Resources.ResourceManager.xml",
++ "ref/netcore50/fr/System.Resources.ResourceManager.xml",
++ "ref/netcore50/it/System.Resources.ResourceManager.xml",
++ "ref/netcore50/ja/System.Resources.ResourceManager.xml",
++ "ref/netcore50/ko/System.Resources.ResourceManager.xml",
++ "ref/netcore50/ru/System.Resources.ResourceManager.xml",
++ "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml",
++ "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/System.Resources.ResourceManager.dll",
++ "ref/netstandard1.0/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/de/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/es/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/it/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml",
++ "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.resources.resourcemanager.4.3.0.nupkg.sha512",
++ "system.resources.resourcemanager.nuspec"
++ ]
++ },
++ "System.Runtime/4.3.0": {
++ "sha512": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
++ "type": "package",
++ "path": "system.runtime/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net462/System.Runtime.dll",
++ "lib/portable-net45+win8+wp80+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net462/System.Runtime.dll",
++ "ref/netcore50/System.Runtime.dll",
++ "ref/netcore50/System.Runtime.xml",
++ "ref/netcore50/de/System.Runtime.xml",
++ "ref/netcore50/es/System.Runtime.xml",
++ "ref/netcore50/fr/System.Runtime.xml",
++ "ref/netcore50/it/System.Runtime.xml",
++ "ref/netcore50/ja/System.Runtime.xml",
++ "ref/netcore50/ko/System.Runtime.xml",
++ "ref/netcore50/ru/System.Runtime.xml",
++ "ref/netcore50/zh-hans/System.Runtime.xml",
++ "ref/netcore50/zh-hant/System.Runtime.xml",
++ "ref/netstandard1.0/System.Runtime.dll",
++ "ref/netstandard1.0/System.Runtime.xml",
++ "ref/netstandard1.0/de/System.Runtime.xml",
++ "ref/netstandard1.0/es/System.Runtime.xml",
++ "ref/netstandard1.0/fr/System.Runtime.xml",
++ "ref/netstandard1.0/it/System.Runtime.xml",
++ "ref/netstandard1.0/ja/System.Runtime.xml",
++ "ref/netstandard1.0/ko/System.Runtime.xml",
++ "ref/netstandard1.0/ru/System.Runtime.xml",
++ "ref/netstandard1.0/zh-hans/System.Runtime.xml",
++ "ref/netstandard1.0/zh-hant/System.Runtime.xml",
++ "ref/netstandard1.2/System.Runtime.dll",
++ "ref/netstandard1.2/System.Runtime.xml",
++ "ref/netstandard1.2/de/System.Runtime.xml",
++ "ref/netstandard1.2/es/System.Runtime.xml",
++ "ref/netstandard1.2/fr/System.Runtime.xml",
++ "ref/netstandard1.2/it/System.Runtime.xml",
++ "ref/netstandard1.2/ja/System.Runtime.xml",
++ "ref/netstandard1.2/ko/System.Runtime.xml",
++ "ref/netstandard1.2/ru/System.Runtime.xml",
++ "ref/netstandard1.2/zh-hans/System.Runtime.xml",
++ "ref/netstandard1.2/zh-hant/System.Runtime.xml",
++ "ref/netstandard1.3/System.Runtime.dll",
++ "ref/netstandard1.3/System.Runtime.xml",
++ "ref/netstandard1.3/de/System.Runtime.xml",
++ "ref/netstandard1.3/es/System.Runtime.xml",
++ "ref/netstandard1.3/fr/System.Runtime.xml",
++ "ref/netstandard1.3/it/System.Runtime.xml",
++ "ref/netstandard1.3/ja/System.Runtime.xml",
++ "ref/netstandard1.3/ko/System.Runtime.xml",
++ "ref/netstandard1.3/ru/System.Runtime.xml",
++ "ref/netstandard1.3/zh-hans/System.Runtime.xml",
++ "ref/netstandard1.3/zh-hant/System.Runtime.xml",
++ "ref/netstandard1.5/System.Runtime.dll",
++ "ref/netstandard1.5/System.Runtime.xml",
++ "ref/netstandard1.5/de/System.Runtime.xml",
++ "ref/netstandard1.5/es/System.Runtime.xml",
++ "ref/netstandard1.5/fr/System.Runtime.xml",
++ "ref/netstandard1.5/it/System.Runtime.xml",
++ "ref/netstandard1.5/ja/System.Runtime.xml",
++ "ref/netstandard1.5/ko/System.Runtime.xml",
++ "ref/netstandard1.5/ru/System.Runtime.xml",
++ "ref/netstandard1.5/zh-hans/System.Runtime.xml",
++ "ref/netstandard1.5/zh-hant/System.Runtime.xml",
++ "ref/portable-net45+win8+wp80+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.runtime.4.3.0.nupkg.sha512",
++ "system.runtime.nuspec"
++ ]
++ },
++ "System.Runtime.Extensions/4.3.0": {
++ "sha512": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==",
++ "type": "package",
++ "path": "system.runtime.extensions/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net462/System.Runtime.Extensions.dll",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net462/System.Runtime.Extensions.dll",
++ "ref/netcore50/System.Runtime.Extensions.dll",
++ "ref/netcore50/System.Runtime.Extensions.xml",
++ "ref/netcore50/de/System.Runtime.Extensions.xml",
++ "ref/netcore50/es/System.Runtime.Extensions.xml",
++ "ref/netcore50/fr/System.Runtime.Extensions.xml",
++ "ref/netcore50/it/System.Runtime.Extensions.xml",
++ "ref/netcore50/ja/System.Runtime.Extensions.xml",
++ "ref/netcore50/ko/System.Runtime.Extensions.xml",
++ "ref/netcore50/ru/System.Runtime.Extensions.xml",
++ "ref/netcore50/zh-hans/System.Runtime.Extensions.xml",
++ "ref/netcore50/zh-hant/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/System.Runtime.Extensions.dll",
++ "ref/netstandard1.0/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/de/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/es/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/fr/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/it/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/ja/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/ko/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/ru/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml",
++ "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/System.Runtime.Extensions.dll",
++ "ref/netstandard1.3/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/de/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/es/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/fr/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/it/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/ja/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/ko/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/ru/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml",
++ "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/System.Runtime.Extensions.dll",
++ "ref/netstandard1.5/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/de/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/es/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/fr/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/it/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/ja/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/ko/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/ru/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml",
++ "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.runtime.extensions.4.3.0.nupkg.sha512",
++ "system.runtime.extensions.nuspec"
++ ]
++ },
++ "System.Runtime.Handles/4.3.0": {
++ "sha512": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==",
++ "type": "package",
++ "path": "system.runtime.handles/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net46/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net46/_._",
++ "ref/netstandard1.3/System.Runtime.Handles.dll",
++ "ref/netstandard1.3/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/de/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/es/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/fr/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/it/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/ja/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/ko/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/ru/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml",
++ "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.runtime.handles.4.3.0.nupkg.sha512",
++ "system.runtime.handles.nuspec"
++ ]
++ },
++ "System.Runtime.InteropServices/4.1.0": {
++ "sha512": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==",
++ "type": "package",
++ "path": "system.runtime.interopservices/4.1.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/net462/System.Runtime.InteropServices.dll",
++ "lib/portable-net45+win8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/net462/System.Runtime.InteropServices.dll",
++ "ref/netcore50/System.Runtime.InteropServices.dll",
++ "ref/netcore50/System.Runtime.InteropServices.xml",
++ "ref/netcore50/de/System.Runtime.InteropServices.xml",
++ "ref/netcore50/es/System.Runtime.InteropServices.xml",
++ "ref/netcore50/fr/System.Runtime.InteropServices.xml",
++ "ref/netcore50/it/System.Runtime.InteropServices.xml",
++ "ref/netcore50/ja/System.Runtime.InteropServices.xml",
++ "ref/netcore50/ko/System.Runtime.InteropServices.xml",
++ "ref/netcore50/ru/System.Runtime.InteropServices.xml",
++ "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml",
++ "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/System.Runtime.InteropServices.dll",
++ "ref/netstandard1.1/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/de/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/es/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/it/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/System.Runtime.InteropServices.dll",
++ "ref/netstandard1.2/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/de/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/es/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/it/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/System.Runtime.InteropServices.dll",
++ "ref/netstandard1.3/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/de/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/es/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/it/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/System.Runtime.InteropServices.dll",
++ "ref/netstandard1.5/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/de/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/es/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/it/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml",
++ "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml",
++ "ref/portable-net45+win8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.runtime.interopservices.4.1.0.nupkg.sha512",
++ "system.runtime.interopservices.nuspec"
++ ]
++ },
++ "System.Text.Encoding/4.3.0": {
++ "sha512": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
++ "type": "package",
++ "path": "system.text.encoding/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Text.Encoding.dll",
++ "ref/netcore50/System.Text.Encoding.xml",
++ "ref/netcore50/de/System.Text.Encoding.xml",
++ "ref/netcore50/es/System.Text.Encoding.xml",
++ "ref/netcore50/fr/System.Text.Encoding.xml",
++ "ref/netcore50/it/System.Text.Encoding.xml",
++ "ref/netcore50/ja/System.Text.Encoding.xml",
++ "ref/netcore50/ko/System.Text.Encoding.xml",
++ "ref/netcore50/ru/System.Text.Encoding.xml",
++ "ref/netcore50/zh-hans/System.Text.Encoding.xml",
++ "ref/netcore50/zh-hant/System.Text.Encoding.xml",
++ "ref/netstandard1.0/System.Text.Encoding.dll",
++ "ref/netstandard1.0/System.Text.Encoding.xml",
++ "ref/netstandard1.0/de/System.Text.Encoding.xml",
++ "ref/netstandard1.0/es/System.Text.Encoding.xml",
++ "ref/netstandard1.0/fr/System.Text.Encoding.xml",
++ "ref/netstandard1.0/it/System.Text.Encoding.xml",
++ "ref/netstandard1.0/ja/System.Text.Encoding.xml",
++ "ref/netstandard1.0/ko/System.Text.Encoding.xml",
++ "ref/netstandard1.0/ru/System.Text.Encoding.xml",
++ "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml",
++ "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml",
++ "ref/netstandard1.3/System.Text.Encoding.dll",
++ "ref/netstandard1.3/System.Text.Encoding.xml",
++ "ref/netstandard1.3/de/System.Text.Encoding.xml",
++ "ref/netstandard1.3/es/System.Text.Encoding.xml",
++ "ref/netstandard1.3/fr/System.Text.Encoding.xml",
++ "ref/netstandard1.3/it/System.Text.Encoding.xml",
++ "ref/netstandard1.3/ja/System.Text.Encoding.xml",
++ "ref/netstandard1.3/ko/System.Text.Encoding.xml",
++ "ref/netstandard1.3/ru/System.Text.Encoding.xml",
++ "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml",
++ "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.text.encoding.4.3.0.nupkg.sha512",
++ "system.text.encoding.nuspec"
++ ]
++ },
++ "System.Text.Encoding.Extensions/4.3.0": {
++ "sha512": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==",
++ "type": "package",
++ "path": "system.text.encoding.extensions/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Text.Encoding.Extensions.dll",
++ "ref/netcore50/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/de/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/es/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/fr/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/it/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/ja/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/ko/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/ru/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml",
++ "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/System.Text.Encoding.Extensions.dll",
++ "ref/netstandard1.0/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/System.Text.Encoding.Extensions.dll",
++ "ref/netstandard1.3/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml",
++ "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.text.encoding.extensions.4.3.0.nupkg.sha512",
++ "system.text.encoding.extensions.nuspec"
++ ]
++ },
++ "System.Threading/4.3.0": {
++ "sha512": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
++ "type": "package",
++ "path": "system.threading/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/netcore50/System.Threading.dll",
++ "lib/netstandard1.3/System.Threading.dll",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Threading.dll",
++ "ref/netcore50/System.Threading.xml",
++ "ref/netcore50/de/System.Threading.xml",
++ "ref/netcore50/es/System.Threading.xml",
++ "ref/netcore50/fr/System.Threading.xml",
++ "ref/netcore50/it/System.Threading.xml",
++ "ref/netcore50/ja/System.Threading.xml",
++ "ref/netcore50/ko/System.Threading.xml",
++ "ref/netcore50/ru/System.Threading.xml",
++ "ref/netcore50/zh-hans/System.Threading.xml",
++ "ref/netcore50/zh-hant/System.Threading.xml",
++ "ref/netstandard1.0/System.Threading.dll",
++ "ref/netstandard1.0/System.Threading.xml",
++ "ref/netstandard1.0/de/System.Threading.xml",
++ "ref/netstandard1.0/es/System.Threading.xml",
++ "ref/netstandard1.0/fr/System.Threading.xml",
++ "ref/netstandard1.0/it/System.Threading.xml",
++ "ref/netstandard1.0/ja/System.Threading.xml",
++ "ref/netstandard1.0/ko/System.Threading.xml",
++ "ref/netstandard1.0/ru/System.Threading.xml",
++ "ref/netstandard1.0/zh-hans/System.Threading.xml",
++ "ref/netstandard1.0/zh-hant/System.Threading.xml",
++ "ref/netstandard1.3/System.Threading.dll",
++ "ref/netstandard1.3/System.Threading.xml",
++ "ref/netstandard1.3/de/System.Threading.xml",
++ "ref/netstandard1.3/es/System.Threading.xml",
++ "ref/netstandard1.3/fr/System.Threading.xml",
++ "ref/netstandard1.3/it/System.Threading.xml",
++ "ref/netstandard1.3/ja/System.Threading.xml",
++ "ref/netstandard1.3/ko/System.Threading.xml",
++ "ref/netstandard1.3/ru/System.Threading.xml",
++ "ref/netstandard1.3/zh-hans/System.Threading.xml",
++ "ref/netstandard1.3/zh-hant/System.Threading.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "runtimes/aot/lib/netcore50/System.Threading.dll",
++ "system.threading.4.3.0.nupkg.sha512",
++ "system.threading.nuspec"
++ ]
++ },
++ "System.Threading.Tasks/4.3.0": {
++ "sha512": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
++ "type": "package",
++ "path": "system.threading.tasks/4.3.0",
++ "files": [
++ "ThirdPartyNotices.txt",
++ "dotnet_library_license.txt",
++ "lib/MonoAndroid10/_._",
++ "lib/MonoTouch10/_._",
++ "lib/net45/_._",
++ "lib/portable-net45+win8+wp8+wpa81/_._",
++ "lib/win8/_._",
++ "lib/wp80/_._",
++ "lib/wpa81/_._",
++ "lib/xamarinios10/_._",
++ "lib/xamarinmac20/_._",
++ "lib/xamarintvos10/_._",
++ "lib/xamarinwatchos10/_._",
++ "ref/MonoAndroid10/_._",
++ "ref/MonoTouch10/_._",
++ "ref/net45/_._",
++ "ref/netcore50/System.Threading.Tasks.dll",
++ "ref/netcore50/System.Threading.Tasks.xml",
++ "ref/netcore50/de/System.Threading.Tasks.xml",
++ "ref/netcore50/es/System.Threading.Tasks.xml",
++ "ref/netcore50/fr/System.Threading.Tasks.xml",
++ "ref/netcore50/it/System.Threading.Tasks.xml",
++ "ref/netcore50/ja/System.Threading.Tasks.xml",
++ "ref/netcore50/ko/System.Threading.Tasks.xml",
++ "ref/netcore50/ru/System.Threading.Tasks.xml",
++ "ref/netcore50/zh-hans/System.Threading.Tasks.xml",
++ "ref/netcore50/zh-hant/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/System.Threading.Tasks.dll",
++ "ref/netstandard1.0/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/de/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/es/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/fr/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/it/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/ja/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/ko/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/ru/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml",
++ "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/System.Threading.Tasks.dll",
++ "ref/netstandard1.3/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/de/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/es/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/fr/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/it/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/ja/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/ko/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/ru/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml",
++ "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml",
++ "ref/portable-net45+win8+wp8+wpa81/_._",
++ "ref/win8/_._",
++ "ref/wp80/_._",
++ "ref/wpa81/_._",
++ "ref/xamarinios10/_._",
++ "ref/xamarinmac20/_._",
++ "ref/xamarintvos10/_._",
++ "ref/xamarinwatchos10/_._",
++ "system.threading.tasks.4.3.0.nupkg.sha512",
++ "system.threading.tasks.nuspec"
++ ]
++ }
++ },
++ "projectFileDependencyGroups": {
++ ".NETCoreApp,Version=v4.0": [
++ "Microsoft.NETCore.Platforms >= 1.0.2-beta-24224-02",
++ "System.IO.FileSystem >= 4.0.1",
++ "System.Reflection.Metadata >= 1.4.1",
++ "System.Runtime.InteropServices >= 4.1.0"
++ ]
++ },
++ "packageFolders": {
++ "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/packages": {},
++ "/home/jang/.dotnet/NuGetFallbackFolder": {}
++ },
++ "project": {
++ "version": "2.0.0",
++ "restore": {
++ "projectUniqueName": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/ToolBox/SOS/NETCore/SOS.NETCore.csproj",
++ "projectName": "SOS.NETCore",
++ "projectPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/ToolBox/SOS/NETCore/SOS.NETCore.csproj",
++ "packagesPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/packages",
++ "outputPath": "/home/jang/DotNet/Git/sec/jang/netcore-jenkins/coreclr-2.0.0.12082/src/ToolBox/SOS/NETCore",
++ "projectStyle": "PackageReference",
++ "skipContentFileWrite": true,
++ "originalTargetFrameworks": [
++ ".NETCoreApp,Version=v4.0"
++ ],
++ "frameworks": {
++ "netcoreapp4.0": {
++ "projectReferences": {}
++ }
++ }
++ },
++ "dependencies": {
++ "Microsoft.NETCore.Platforms": {
++ "target": "Package",
++ "version": "1.0.2-beta-24224-02"
++ },
++ "System.IO.FileSystem": {
++ "target": "Package",
++ "version": "4.0.1"
++ },
++ "System.Runtime.InteropServices": {
++ "target": "Package",
++ "version": "4.1.0"
++ },
++ "System.Reflection.Metadata": {
++ "target": "Package",
++ "version": "1.4.1"
++ }
++ },
++ "frameworks": {
++ "netcoreapp4.0": {}
++ }
++ }
++}
+\ No newline at end of file
+--
+1.9.1
+
diff --git a/packaging/0002-x86-Linux-Thread-safe-UMThunkMarshInfo-RunTimeInit-1.patch b/packaging/0002-x86-Linux-Thread-safe-UMThunkMarshInfo-RunTimeInit-1.patch
new file mode 100644
index 0000000000..4081470380
--- /dev/null
+++ b/packaging/0002-x86-Linux-Thread-safe-UMThunkMarshInfo-RunTimeInit-1.patch
@@ -0,0 +1,41 @@
+From 7cc0b213808a64978e520a91ead790da431c5c9b Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Thu, 25 May 2017 02:34:59 +0900
+Subject: [PATCH 02/23] [x86/Linux] Thread-safe UMThunkMarshInfo::RunTimeInit
+ (#11864)
+
+---
+ src/vm/dllimportcallback.cpp | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/vm/dllimportcallback.cpp b/src/vm/dllimportcallback.cpp
+index c70d52d..90c01a4 100644
+--- a/src/vm/dllimportcallback.cpp
++++ b/src/vm/dllimportcallback.cpp
+@@ -1382,9 +1382,9 @@ VOID UMThunkMarshInfo::RunTimeInit()
+ UINT16 cbRetPop = 0;
+
+ //
+- // m_cbStackArgSize represents the number of arg bytes for the MANAGED signature
++ // cbStackArgSize represents the number of arg bytes for the MANAGED signature
+ //
+- m_cbStackArgSize = 0;
++ UINT32 cbStackArgSize = 0;
+
+ int offs = 0;
+
+@@ -1410,9 +1410,10 @@ VOID UMThunkMarshInfo::RunTimeInit()
+ else
+ {
+ offs += StackElemSize(cbSize);
+- m_cbStackArgSize += StackElemSize(cbSize);
++ cbStackArgSize += StackElemSize(cbSize);
+ }
+ }
++ m_cbStackArgSize = cbStackArgSize;
+ m_cbActualArgSize = (pStubMD != NULL) ? pStubMD->AsDynamicMethodDesc()->GetNativeStackArgSize() : offs;
+
+ PInvokeStaticSigInfo sigInfo;
+--
+1.9.1
+
diff --git a/packaging/0003-Enable-pow-for-arm-armel-in-tryrun-11703.patch b/packaging/0003-Enable-pow-for-arm-armel-in-tryrun-11703.patch
new file mode 100644
index 0000000000..c6c22a6602
--- /dev/null
+++ b/packaging/0003-Enable-pow-for-arm-armel-in-tryrun-11703.patch
@@ -0,0 +1,40 @@
+From 859fee1e493bfb32ab549bca9cf0dd0b977ce885 Mon Sep 17 00:00:00 2001
+From: SaeHie Park <saehie.park@gmail.com>
+Date: Fri, 19 May 2017 00:20:57 +0900
+Subject: [PATCH 03/23] Enable pow for arm/armel in tryrun (#11703)
+
+This will fix CoreFX System.Tests.MathFTests.Pow() failures
+---
+ cross/arm/tryrun.cmake | 2 +-
+ cross/armel/tryrun.cmake | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/cross/arm/tryrun.cmake b/cross/arm/tryrun.cmake
+index 26a30e5..55265b4 100644
+--- a/cross/arm/tryrun.cmake
++++ b/cross/arm/tryrun.cmake
+@@ -55,7 +55,7 @@ SET( HAVE_COMPATIBLE_ASIN_EXITCODE
+ CACHE STRING "Result from TRY_RUN" FORCE)
+
+ SET( HAVE_COMPATIBLE_POW_EXITCODE
+- 1
++ 0
+ CACHE STRING "Result from TRY_RUN" FORCE)
+
+ SET( HAVE_VALID_NEGATIVE_INF_POW_EXITCODE
+diff --git a/cross/armel/tryrun.cmake b/cross/armel/tryrun.cmake
+index 26a30e5..55265b4 100644
+--- a/cross/armel/tryrun.cmake
++++ b/cross/armel/tryrun.cmake
+@@ -55,7 +55,7 @@ SET( HAVE_COMPATIBLE_ASIN_EXITCODE
+ CACHE STRING "Result from TRY_RUN" FORCE)
+
+ SET( HAVE_COMPATIBLE_POW_EXITCODE
+- 1
++ 0
+ CACHE STRING "Result from TRY_RUN" FORCE)
+
+ SET( HAVE_VALID_NEGATIVE_INF_POW_EXITCODE
+--
+1.9.1
+
diff --git a/packaging/0004-ARM-Linux-Validate-memory-using-ldrb-instead-of-ldr.patch b/packaging/0004-ARM-Linux-Validate-memory-using-ldrb-instead-of-ldr.patch
new file mode 100644
index 0000000000..b9756b24f8
--- /dev/null
+++ b/packaging/0004-ARM-Linux-Validate-memory-using-ldrb-instead-of-ldr.patch
@@ -0,0 +1,27 @@
+From 5e90ac56425ac2e20eda55f3d40a0026eec8089b Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Fri, 9 Jun 2017 09:52:53 +0900
+Subject: [PATCH 04/23] [ARM/Linux] Validate memory using ldrb instead of ldr
+
+---
+ src/vm/arm/memcpy.S | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/vm/arm/memcpy.S b/src/vm/arm/memcpy.S
+index b978860..0c2c26e 100644
+--- a/src/vm/arm/memcpy.S
++++ b/src/vm/arm/memcpy.S
+@@ -22,8 +22,8 @@
+ PROLOG_PUSH "{r7, lr}"
+ PROLOG_STACK_SAVE r7
+
+- ldr r3, [r0]
+- ldr r3, [r1]
++ ldrb r3, [r0]
++ ldrb r3, [r1]
+
+ blx C_FUNC(memcpy)
+
+--
+1.9.1
+
diff --git a/packaging/0005-Add-skipped-testcase-on-TM1.patch b/packaging/0005-Add-skipped-testcase-on-TM1.patch
new file mode 100644
index 0000000000..8e9542e966
--- /dev/null
+++ b/packaging/0005-Add-skipped-testcase-on-TM1.patch
@@ -0,0 +1,33 @@
+From f64b4e3185745eecaa1e9b1a551b679f141ddaa2 Mon Sep 17 00:00:00 2001
+From: Jiyoung Yun <jy910.yun@samsung.com>
+Date: Tue, 20 Jun 2017 15:09:10 +0900
+Subject: [PATCH 05/23] Add skipped testcase on TM1
+
+Lists:
+JIT.jit64.opt.cse.hugeSimpleExpr1.hugeSimpleExpr1
+GC.Regressions.v2.0-rtm.494226.494226.494226
+GC.Scenarios.ServerModel.servermodel.servermodel
+JIT.jit64.opt.cse.HugeField1.HugeField1
+JIT.jit64.opt.cse.HugeField2.HugeField2
+JIT.jit64.opt.cse.hugeexpr1.hugeexpr1
+---
+ tests/testsUnsupportedOnARM32.txt | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/tests/testsUnsupportedOnARM32.txt b/tests/testsUnsupportedOnARM32.txt
+index d889b57..82cc41d 100644
+--- a/tests/testsUnsupportedOnARM32.txt
++++ b/tests/testsUnsupportedOnARM32.txt
+@@ -10,3 +10,9 @@ JIT/Methodical/xxobj/sizeof/_il_relsizeof32/_il_relsizeof32.sh
+ JIT/Methodical/xxobj/sizeof/_il_relsizeof64/_il_relsizeof64.sh
+ JIT/Regression/JitBlue/devdiv_902271/DevDiv_902271/DevDiv_902271.sh
+ JIT/jit64/opt/cse/HugeArray1/HugeArray1.sh
++JIT/jit64/opt/cse/hugeSimpleExpr1/hugeSimpleExpr1.sh
++GC/Regressions/v2.0-rtm/494226/494226/494226.sh
++GC/Scenarios/ServerModel/servermodel/servermodel.sh
++JIT/jit64/opt/cse/HugeField1/HugeField1.sh
++JIT/jit64/opt/cse/HugeField2/HugeField2.sh
++JIT/jit64/opt/cse/hugeexpr1/hugeexpr1.sh
+--
+1.9.1
+
diff --git a/packaging/0006-Set-local-variables-as-addr-exposed-if-it-appears-in.patch b/packaging/0006-Set-local-variables-as-addr-exposed-if-it-appears-in.patch
new file mode 100644
index 0000000000..e8b06f412a
--- /dev/null
+++ b/packaging/0006-Set-local-variables-as-addr-exposed-if-it-appears-in.patch
@@ -0,0 +1,49 @@
+From 49b89a063fc18e2000a978ed0e0e0e2aeab42f8a Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Wed, 14 Jun 2017 07:05:12 +0900
+Subject: [PATCH 06/23] Set local variables as addr-exposed if it appears in
+ ADDR expression
+
+---
+ src/jit/morph.cpp | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp
+index 27a1dae..629dc83 100644
+--- a/src/jit/morph.cpp
++++ b/src/jit/morph.cpp
+@@ -8921,7 +8921,6 @@ GenTreePtr Compiler::fgMorphOneAsgBlockOp(GenTreePtr tree)
+ }
+ else
+ {
+-#ifndef LEGACY_BACKEND
+
+ // The source argument of the copyblk can potentially
+ // be accessed only through indir(addr(lclVar))
+@@ -8931,6 +8930,7 @@ GenTreePtr Compiler::fgMorphOneAsgBlockOp(GenTreePtr tree)
+ // we don't delete it as a dead store later on.
+ unsigned lclVarNum = lclVarTree->gtLclVarCommon.gtLclNum;
+ lvaTable[lclVarNum].lvAddrExposed = true;
++#ifndef LEGACY_BACKEND
+ lvaSetVarDoNotEnregister(lclVarNum DEBUGARG(DNER_AddrExposed));
+
+ #else // LEGACY_BACKEND
+@@ -10301,7 +10301,6 @@ GenTreePtr Compiler::fgMorphCopyBlock(GenTreePtr tree)
+
+ tree = gtNewAssignNode(gtNewLclvNode(addrSpillTemp, TYP_BYREF), addrSpill);
+
+-#ifndef LEGACY_BACKEND
+ // If we are assigning the address of a LclVar here
+ // liveness does not account for this kind of address taken use.
+ //
+@@ -10319,7 +10318,6 @@ GenTreePtr Compiler::fgMorphCopyBlock(GenTreePtr tree)
+ lvaSetVarDoNotEnregister(lclVarNum DEBUGARG(DNER_AddrExposed));
+ }
+ }
+-#endif // !LEGACY_BACKEND
+ }
+
+ _AssignFields:
+--
+1.9.1
+
diff --git a/packaging/0007-Revert-unnecessary-changes.patch b/packaging/0007-Revert-unnecessary-changes.patch
new file mode 100644
index 0000000000..b279c2d216
--- /dev/null
+++ b/packaging/0007-Revert-unnecessary-changes.patch
@@ -0,0 +1,34 @@
+From 529a5753bdeee30c8fc73c6fc9119f34940a64ab Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=EC=98=A4=ED=98=95=EC=84=9D/Developer=20Experience=20Lab?=
+ =?UTF-8?q?=28S/W=EC=84=BC=ED=84=B0=29/Senior=20Engineer/=EC=82=BC?=
+ =?UTF-8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= <hseok82.oh@samsung.com>
+Date: Tue, 20 Jun 2017 12:20:44 +0900
+Subject: [PATCH 07/23] Revert unnecessary changes
+
+---
+ src/jit/morph.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp
+index 629dc83..3475889 100644
+--- a/src/jit/morph.cpp
++++ b/src/jit/morph.cpp
+@@ -8921,6 +8921,7 @@ GenTreePtr Compiler::fgMorphOneAsgBlockOp(GenTreePtr tree)
+ }
+ else
+ {
++#ifndef LEGACY_BACKEND
+
+ // The source argument of the copyblk can potentially
+ // be accessed only through indir(addr(lclVar))
+@@ -8930,7 +8931,6 @@ GenTreePtr Compiler::fgMorphOneAsgBlockOp(GenTreePtr tree)
+ // we don't delete it as a dead store later on.
+ unsigned lclVarNum = lclVarTree->gtLclVarCommon.gtLclNum;
+ lvaTable[lclVarNum].lvAddrExposed = true;
+-#ifndef LEGACY_BACKEND
+ lvaSetVarDoNotEnregister(lclVarNum DEBUGARG(DNER_AddrExposed));
+
+ #else // LEGACY_BACKEND
+--
+1.9.1
+
diff --git a/packaging/0008-Add-skipped-testcase-superpmi.patch b/packaging/0008-Add-skipped-testcase-superpmi.patch
new file mode 100644
index 0000000000..7513a6e8e9
--- /dev/null
+++ b/packaging/0008-Add-skipped-testcase-superpmi.patch
@@ -0,0 +1,22 @@
+From c533925e0a6e1d3c6921abcf41ab99276443cd83 Mon Sep 17 00:00:00 2001
+From: Hyeongseok Oh <hseok82.oh@samsung.com>
+Date: Mon, 26 Jun 2017 16:12:08 +0900
+Subject: [PATCH 08/23] Add skipped testcase: superpmi
+
+Skip JIT/superpmi/superpmicollect/superpmicollect.sh
+---
+ tests/testsUnsupportedOnARM32.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/tests/testsUnsupportedOnARM32.txt b/tests/testsUnsupportedOnARM32.txt
+index 82cc41d..536db69 100644
+--- a/tests/testsUnsupportedOnARM32.txt
++++ b/tests/testsUnsupportedOnARM32.txt
+@@ -16,3 +16,4 @@ GC/Scenarios/ServerModel/servermodel/servermodel.sh
+ JIT/jit64/opt/cse/HugeField1/HugeField1.sh
+ JIT/jit64/opt/cse/HugeField2/HugeField2.sh
+ JIT/jit64/opt/cse/hugeexpr1/hugeexpr1.sh
++JIT/superpmi/superpmicollect/superpmicollect.sh
+--
+1.9.1
+
diff --git a/packaging/0009-x86-Linux-Adjust-SP-in-throwing-helper-block-12504-1.patch b/packaging/0009-x86-Linux-Adjust-SP-in-throwing-helper-block-12504-1.patch
new file mode 100644
index 0000000000..fef96c9ceb
--- /dev/null
+++ b/packaging/0009-x86-Linux-Adjust-SP-in-throwing-helper-block-12504-1.patch
@@ -0,0 +1,65 @@
+From dbfd81c905d8f97aee7b6e595df02d49f98f3f70 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=EB=B0=95=EC=A2=85=ED=98=84/Developer=20Experience=20Lab?=
+ =?UTF-8?q?=28S/W=EC=84=BC=ED=84=B0=29/Senior=20Engineer/=EC=82=BC?=
+ =?UTF-8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= <jh1302.park@samsung.com>
+Date: Thu, 10 Aug 2017 17:25:46 +0900
+Subject: [PATCH 09/23] [x86/Linux] Adjust SP in throwing helper block (#12504)
+ (#12)
+
+* [x86/Linux] Adjust SP in throwing helper block
+
+* Fix format error
+
+* Use funKind intead of siInFuncletRegion
+
+* Use genSPtoFPdelta (and add some comments)
+
+* Fix a typo
+
+* Revert irrelevant changes
+---
+ src/jit/codegencommon.cpp | 21 ++++++++++++++++++++-
+ 1 file changed, 20 insertions(+), 1 deletion(-)
+
+diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp
+index 94cc9b9..719299e 100644
+--- a/src/jit/codegencommon.cpp
++++ b/src/jit/codegencommon.cpp
+@@ -1642,6 +1642,18 @@ void CodeGen::genAdjustStackLevel(BasicBlock* block)
+ {
+ #if !FEATURE_FIXED_OUT_ARGS
+ // Check for inserted throw blocks and adjust genStackLevel.
++ CLANG_FORMAT_COMMENT_ANCHOR;
++
++#if defined(UNIX_X86_ABI)
++ if (isFramePointerUsed() && compiler->fgIsThrowHlpBlk(block))
++ {
++ // x86/Linux requires stack frames to be 16-byte aligned, but SP may be unaligned
++ // at this point if a jump to this block is made in the middle of pushing arugments.
++ //
++ // Here we restore SP to prevent potential stack alignment issues.
++ getEmitter()->emitIns_R_AR(INS_lea, EA_PTRSIZE, REG_SPBASE, REG_FPBASE, -genSPtoFPdelta());
++ }
++#endif
+
+ if (!isFramePointerUsed() && compiler->fgIsThrowHlpBlk(block))
+ {
+@@ -2694,7 +2706,14 @@ void CodeGen::genExitCode(BasicBlock* block)
+
+ void CodeGen::genJumpToThrowHlpBlk(emitJumpKind jumpKind, SpecialCodeKind codeKind, GenTreePtr failBlk)
+ {
+- if (!compiler->opts.compDbgCode)
++ bool useThrowHlpBlk = !compiler->opts.compDbgCode;
++
++#if defined(UNIX_X86_ABI) && FEATURE_EH_FUNCLETS
++ // Inline exception-throwing code in funclet to make it possible to unwind funclet frames.
++ useThrowHlpBlk = useThrowHlpBlk && (compiler->funCurrentFunc()->funKind == FUNC_ROOT);
++#endif // UNIX_X86_ABI && FEATURE_EH_FUNCLETS
++
++ if (useThrowHlpBlk)
+ {
+ /* For non-debuggable code, find and use the helper block for
+ raising the exception. The block may be shared by other trees too. */
+--
+1.9.1
+
diff --git a/packaging/0010-Use-udf-0xff-instead-of-bkpt-0xbe-as-a-poison-13.patch b/packaging/0010-Use-udf-0xff-instead-of-bkpt-0xbe-as-a-poison-13.patch
new file mode 100644
index 0000000000..dad9f300d3
--- /dev/null
+++ b/packaging/0010-Use-udf-0xff-instead-of-bkpt-0xbe-as-a-poison-13.patch
@@ -0,0 +1,425 @@
+From 90fd3a315a5300c4c72086e541d35a73694e176b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=EC=9D=B4=EC=B6=98=EC=84=9D/Developer=20Experience=20Lab?=
+ =?UTF-8?q?=28S/W=EC=84=BC=ED=84=B0=29/Senior=20Engineer/=EC=82=BC?=
+ =?UTF-8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= <chunseok.lee@samsung.com>
+Date: Thu, 24 Aug 2017 07:27:23 +0900
+Subject: [PATCH 10/23] Use 'udf 0xff' instead of 'bkpt 0xbe' as a poison (#13)
+
+* Fill freed loader heap chunk with non-zero value (#12731)
+
+* Add FEATURE_LOADER_HEAP_GUARD feature
+
+* Invoke memset only for reclaimed regions
+
+* Enable FEATURE_LOADER_HEAP_GUARD by default
+
+* Insert trap inside UMEntryThunk::Terminate
+
+* Make all exectuable heaps not to zero-initialize itself
+
+Use fZeroInit (instead of fMakeRelazed)
+
+* Add comment
+
+* Revert unnecessary changes
+
+* Add and use 'Poison' method to insert a trap
+
+* Do NOT invoke FlushInstructionCache
+
+* Update comment
+
+* Add comment on ARM Poisoning instruction
+
+* Use X86_INSTR_INT3 instead of 0xCC
+
+* Use 'udf 0xff' instead of 'bkpt 0xbe' as a poison (#13152)
+---
+ src/inc/loaderheap.h | 23 +++++++++++++----------
+ src/utilcode/loaderheap.cpp | 35 ++++++++++++++++++++++++++---------
+ src/vm/amd64/cgenamd64.cpp | 13 +++++++++++++
+ src/vm/amd64/cgencpu.h | 1 +
+ src/vm/arm/cgencpu.h | 1 +
+ src/vm/arm/stubs.cpp | 6 ++++++
+ src/vm/arm64/cgencpu.h | 1 +
+ src/vm/arm64/stubs.cpp | 4 ++++
+ src/vm/dllimportcallback.cpp | 12 +++---------
+ src/vm/dllimportcallback.h | 4 ----
+ src/vm/i386/cgencpu.h | 1 +
+ src/vm/i386/cgenx86.cpp | 7 +++++++
+ src/vm/loaderallocator.cpp | 4 +++-
+ 13 files changed, 79 insertions(+), 33 deletions(-)
+
+diff --git a/src/inc/loaderheap.h b/src/inc/loaderheap.h
+index 7d4c48f..4333505 100644
+--- a/src/inc/loaderheap.h
++++ b/src/inc/loaderheap.h
+@@ -217,7 +217,7 @@ private:
+
+ size_t * m_pPrivatePerfCounter_LoaderBytes;
+
+- DWORD m_flProtect;
++ DWORD m_Options;
+
+ LoaderHeapFreeBlock *m_pFirstFreeBlock;
+
+@@ -288,7 +288,8 @@ protected:
+ SIZE_T dwReservedRegionSize,
+ size_t *pPrivatePerfCounter_LoaderBytes = NULL,
+ RangeList *pRangeList = NULL,
+- BOOL fMakeExecutable = FALSE);
++ BOOL fMakeExecutable = FALSE,
++ BOOL fZeroInit = TRUE);
+
+ ~UnlockedLoaderHeap();
+ #endif
+@@ -398,10 +399,8 @@ public:
+ return m_dwTotalAlloc;
+ }
+
+- BOOL IsExecutable()
+- {
+- return (PAGE_EXECUTE_READWRITE == m_flProtect);
+- }
++ BOOL IsExecutable();
++ BOOL IsZeroInit();
+
+
+ public:
+@@ -447,14 +446,16 @@ public:
+ DWORD dwCommitBlockSize,
+ size_t *pPrivatePerfCounter_LoaderBytes = NULL,
+ RangeList *pRangeList = NULL,
+- BOOL fMakeExecutable = FALSE
++ BOOL fMakeExecutable = FALSE,
++ BOOL fZeroInit = TRUE
+ )
+ : UnlockedLoaderHeap(dwReserveBlockSize,
+ dwCommitBlockSize,
+ NULL, 0,
+ pPrivatePerfCounter_LoaderBytes,
+ pRangeList,
+- fMakeExecutable)
++ fMakeExecutable,
++ fZeroInit)
+ {
+ WRAPPER_NO_CONTRACT;
+ m_CriticalSection = NULL;
+@@ -469,7 +470,8 @@ public:
+ SIZE_T dwReservedRegionSize,
+ size_t *pPrivatePerfCounter_LoaderBytes = NULL,
+ RangeList *pRangeList = NULL,
+- BOOL fMakeExecutable = FALSE
++ BOOL fMakeExecutable = FALSE,
++ BOOL fZeroInit = TRUE
+ )
+ : UnlockedLoaderHeap(dwReserveBlockSize,
+ dwCommitBlockSize,
+@@ -477,7 +479,8 @@ public:
+ dwReservedRegionSize,
+ pPrivatePerfCounter_LoaderBytes,
+ pRangeList,
+- fMakeExecutable)
++ fMakeExecutable,
++ fZeroInit)
+ {
+ WRAPPER_NO_CONTRACT;
+ m_CriticalSection = NULL;
+diff --git a/src/utilcode/loaderheap.cpp b/src/utilcode/loaderheap.cpp
+index a005ac8..21aa150 100644
+--- a/src/utilcode/loaderheap.cpp
++++ b/src/utilcode/loaderheap.cpp
+@@ -10,6 +10,9 @@
+ #define DONOT_DEFINE_ETW_CALLBACK
+ #include "eventtracebase.h"
+
++#define LHF_EXECUTABLE 0x1
++#define LHF_ZEROINIT 0x2
++
+ #ifndef DACCESS_COMPILE
+
+ INDEBUG(DWORD UnlockedLoaderHeap::s_dwNumInstancesOfLoaderHeaps = 0;)
+@@ -903,7 +906,8 @@ UnlockedLoaderHeap::UnlockedLoaderHeap(DWORD dwReserveBlockSize,
+ SIZE_T dwReservedRegionSize,
+ size_t *pPrivatePerfCounter_LoaderBytes,
+ RangeList *pRangeList,
+- BOOL fMakeExecutable)
++ BOOL fMakeExecutable,
++ BOOL fZeroInit)
+ {
+ CONTRACTL
+ {
+@@ -939,10 +943,11 @@ UnlockedLoaderHeap::UnlockedLoaderHeap(DWORD dwReserveBlockSize,
+
+ m_pPrivatePerfCounter_LoaderBytes = pPrivatePerfCounter_LoaderBytes;
+
++ m_Options = 0;
+ if (fMakeExecutable)
+- m_flProtect = PAGE_EXECUTE_READWRITE;
+- else
+- m_flProtect = PAGE_READWRITE;
++ m_Options |= LHF_EXECUTABLE;
++ if (fZeroInit)
++ m_Options |= LHF_ZEROINIT;
+
+ m_pFirstFreeBlock = NULL;
+
+@@ -1133,7 +1138,7 @@ BOOL UnlockedLoaderHeap::UnlockedReservePages(size_t dwSizeToCommit)
+ }
+
+ // Commit first set of pages, since it will contain the LoaderHeapBlock
+- void *pTemp = ClrVirtualAlloc(pData, dwSizeToCommit, MEM_COMMIT, m_flProtect);
++ void *pTemp = ClrVirtualAlloc(pData, dwSizeToCommit, MEM_COMMIT, (m_Options & LHF_EXECUTABLE) ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE);
+ if (pTemp == NULL)
+ {
+ //_ASSERTE(!"Unable to ClrVirtualAlloc commit in a loaderheap");
+@@ -1225,7 +1230,7 @@ BOOL UnlockedLoaderHeap::GetMoreCommittedPages(size_t dwMinSize)
+ dwSizeToCommit = ALIGN_UP(dwSizeToCommit, PAGE_SIZE);
+
+ // Yes, so commit the desired number of reserved pages
+- void *pData = ClrVirtualAlloc(m_pPtrToEndOfCommittedRegion, dwSizeToCommit, MEM_COMMIT, m_flProtect);
++ void *pData = ClrVirtualAlloc(m_pPtrToEndOfCommittedRegion, dwSizeToCommit, MEM_COMMIT, (m_Options & LHF_EXECUTABLE) ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE);
+ if (pData == NULL)
+ return FALSE;
+
+@@ -1351,7 +1356,7 @@ again:
+ // Don't fill the memory we allocated - it is assumed to be zeroed - fill the memory after it
+ memset(pAllocatedBytes + dwRequestedSize, 0xEE, LOADER_HEAP_DEBUG_BOUNDARY);
+ #endif
+- if (dwRequestedSize > 0)
++ if ((dwRequestedSize > 0) && (m_Options & LHF_ZEROINIT))
+ {
+ _ASSERTE_MSG(pAllocatedBytes[0] == 0 && memcmp(pAllocatedBytes, pAllocatedBytes + 1, dwRequestedSize - 1) == 0,
+ "LoaderHeap must return zero-initialized memory");
+@@ -1529,7 +1534,8 @@ void UnlockedLoaderHeap::UnlockedBackoutMem(void *pMem,
+ {
+ // Cool. This was the last block allocated. We can just undo the allocation instead
+ // of going to the freelist.
+- memset(pMem, 0, dwSize); // Must zero init this memory as AllocMem expect it
++ if (m_Options & LHF_ZEROINIT)
++ memset(pMem, 0x00, dwSize); // Fill freed region with 0
+ m_pAllocPtr = (BYTE*)pMem;
+ }
+ else
+@@ -1639,6 +1645,7 @@ void *UnlockedLoaderHeap::UnlockedAllocAlignedMem_NoThrow(size_t dwRequestedSiz
+
+
+ ((BYTE*&)pResult) += extra;
++
+ #ifdef _DEBUG
+ BYTE *pAllocatedBytes = (BYTE *)pResult;
+ #if LOADER_HEAP_DEBUG_BOUNDARY > 0
+@@ -1646,7 +1653,7 @@ void *UnlockedLoaderHeap::UnlockedAllocAlignedMem_NoThrow(size_t dwRequestedSiz
+ memset(pAllocatedBytes + dwRequestedSize, 0xee, LOADER_HEAP_DEBUG_BOUNDARY);
+ #endif
+
+- if (dwRequestedSize != 0)
++ if ((dwRequestedSize != 0) && (m_Options & LHF_ZEROINIT))
+ {
+ _ASSERTE_MSG(pAllocatedBytes[0] == 0 && memcmp(pAllocatedBytes, pAllocatedBytes + 1, dwRequestedSize - 1) == 0,
+ "LoaderHeap must return zero-initialized memory");
+@@ -1766,6 +1773,16 @@ void *UnlockedLoaderHeap::UnlockedAllocMemForCode_NoThrow(size_t dwHeaderSize, s
+
+ #endif // #ifndef DACCESS_COMPILE
+
++BOOL UnlockedLoaderHeap::IsExecutable()
++{
++ return (m_Options & LHF_EXECUTABLE);
++}
++
++BOOL UnlockedLoaderHeap::IsZeroInit()
++{
++ return (m_Options & LHF_ZEROINIT);
++}
++
+ #ifdef DACCESS_COMPILE
+
+ void UnlockedLoaderHeap::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)
+diff --git a/src/vm/amd64/cgenamd64.cpp b/src/vm/amd64/cgenamd64.cpp
+index 497abcd..20dca22 100644
+--- a/src/vm/amd64/cgenamd64.cpp
++++ b/src/vm/amd64/cgenamd64.cpp
+@@ -670,6 +670,19 @@ void UMEntryThunkCode::Encode(BYTE* pTargetCode, void* pvSecretParam)
+ _ASSERTE(DbgIsExecutable(&m_movR10[0], &m_jmpRAX[3]-&m_movR10[0]));
+ }
+
++void UMEntryThunkCode::Poison()
++{
++ CONTRACTL
++ {
++ NOTHROW;
++ GC_NOTRIGGER;
++ MODE_ANY;
++ }
++ CONTRACTL_END;
++
++ m_movR10[0] = X86_INSTR_INT3;
++}
++
+ UMEntryThunk* UMEntryThunk::Decode(LPVOID pCallback)
+ {
+ LIMITED_METHOD_CONTRACT;
+diff --git a/src/vm/amd64/cgencpu.h b/src/vm/amd64/cgencpu.h
+index 2d4dce0..8a27525 100644
+--- a/src/vm/amd64/cgencpu.h
++++ b/src/vm/amd64/cgencpu.h
+@@ -466,6 +466,7 @@ struct DECLSPEC_ALIGN(8) UMEntryThunkCode
+ BYTE m_padding2[5];
+
+ void Encode(BYTE* pTargetCode, void* pvSecretParam);
++ void Poison();
+
+ LPCBYTE GetEntryPoint() const
+ {
+diff --git a/src/vm/arm/cgencpu.h b/src/vm/arm/cgencpu.h
+index 181d5f1..6f128f6 100644
+--- a/src/vm/arm/cgencpu.h
++++ b/src/vm/arm/cgencpu.h
+@@ -988,6 +988,7 @@ struct DECLSPEC_ALIGN(4) UMEntryThunkCode
+ TADDR m_pvSecretParam;
+
+ void Encode(BYTE* pTargetCode, void* pvSecretParam);
++ void Poison();
+
+ LPCBYTE GetEntryPoint() const
+ {
+diff --git a/src/vm/arm/stubs.cpp b/src/vm/arm/stubs.cpp
+index 3088761..c832911 100644
+--- a/src/vm/arm/stubs.cpp
++++ b/src/vm/arm/stubs.cpp
+@@ -2523,6 +2523,12 @@ void UMEntryThunkCode::Encode(BYTE* pTargetCode, void* pvSecretParam)
+ FlushInstructionCache(GetCurrentProcess(),&m_code,sizeof(m_code));
+ }
+
++void UMEntryThunkCode::Poison()
++{
++ // Insert 'udf 0xff' at the entry point
++ m_code[0] = 0xdeff;
++}
++
+ ///////////////////////////// UNIMPLEMENTED //////////////////////////////////
+
+ #ifndef DACCESS_COMPILE
+diff --git a/src/vm/arm64/cgencpu.h b/src/vm/arm64/cgencpu.h
+index d8bbcf7..5c522c5 100644
+--- a/src/vm/arm64/cgencpu.h
++++ b/src/vm/arm64/cgencpu.h
+@@ -481,6 +481,7 @@ struct DECLSPEC_ALIGN(16) UMEntryThunkCode
+ TADDR m_pvSecretParam;
+
+ void Encode(BYTE* pTargetCode, void* pvSecretParam);
++ void Poison();
+
+ LPCBYTE GetEntryPoint() const
+ {
+diff --git a/src/vm/arm64/stubs.cpp b/src/vm/arm64/stubs.cpp
+index 40d2749..df2124d 100644
+--- a/src/vm/arm64/stubs.cpp
++++ b/src/vm/arm64/stubs.cpp
+@@ -1244,6 +1244,10 @@ void UMEntryThunkCode::Encode(BYTE* pTargetCode, void* pvSecretParam)
+ FlushInstructionCache(GetCurrentProcess(),&m_code,sizeof(m_code));
+ }
+
++void UMEntryThunkCode::Poison()
++{
++
++}
+
+ #ifdef PROFILING_SUPPORTED
+ #include "proftoeeinterfaceimpl.h"
+diff --git a/src/vm/dllimportcallback.cpp b/src/vm/dllimportcallback.cpp
+index 90c01a4..8684c12 100644
+--- a/src/vm/dllimportcallback.cpp
++++ b/src/vm/dllimportcallback.cpp
+@@ -1111,13 +1111,8 @@ UMEntryThunk* UMEntryThunk::CreateUMEntryThunk()
+
+ UMEntryThunk * p;
+
+-#ifdef FEATURE_WINDOWSPHONE
+ // On the phone, use loader heap to save memory commit of regular executable heap
+ p = (UMEntryThunk *)(void *)SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()->AllocMem(S_SIZE_T(sizeof(UMEntryThunk)));
+-#else
+- p = new (executable) UMEntryThunk;
+- memset (p, 0, sizeof(*p));
+-#endif
+
+ RETURN p;
+ }
+@@ -1126,11 +1121,10 @@ void UMEntryThunk::Terminate()
+ {
+ WRAPPER_NO_CONTRACT;
+
+-#ifdef FEATURE_WINDOWSPHONE
++ _ASSERTE(!SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()->IsZeroInit());
++ m_code.Poison();
++
+ SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()->BackoutMem(this, sizeof(UMEntryThunk));
+-#else
+- DeleteExecutable(this);
+-#endif
+ }
+
+ VOID UMEntryThunk::FreeUMEntryThunk(UMEntryThunk* p)
+diff --git a/src/vm/dllimportcallback.h b/src/vm/dllimportcallback.h
+index af2a0b1..e79c5f0 100644
+--- a/src/vm/dllimportcallback.h
++++ b/src/vm/dllimportcallback.h
+@@ -326,10 +326,6 @@ public:
+ {
+ DestroyLongWeakHandle(GetObjectHandle());
+ }
+-
+-#ifdef _DEBUG
+- FillMemory(this, sizeof(*this), 0xcc);
+-#endif
+ }
+
+ void Terminate();
+diff --git a/src/vm/i386/cgencpu.h b/src/vm/i386/cgencpu.h
+index ff76d99..e4a623b 100644
+--- a/src/vm/i386/cgencpu.h
++++ b/src/vm/i386/cgencpu.h
+@@ -504,6 +504,7 @@ struct DECLSPEC_ALIGN(4) UMEntryThunkCode
+ const BYTE * m_execstub; // pointer to destination code // make sure the backpatched portion is dword aligned.
+
+ void Encode(BYTE* pTargetCode, void* pvSecretParam);
++ void Poison();
+
+ LPCBYTE GetEntryPoint() const
+ {
+diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp
+index 0a276c0..ca81bb7 100644
+--- a/src/vm/i386/cgenx86.cpp
++++ b/src/vm/i386/cgenx86.cpp
+@@ -1587,6 +1587,13 @@ void UMEntryThunkCode::Encode(BYTE* pTargetCode, void* pvSecretParam)
+ FlushInstructionCache(GetCurrentProcess(),GetEntryPoint(),sizeof(UMEntryThunkCode));
+ }
+
++void UMEntryThunkCode::Poison()
++{
++ LIMITED_METHOD_CONTRACT;
++
++ m_movEAX = X86_INSTR_INT3;
++}
++
+ UMEntryThunk* UMEntryThunk::Decode(LPVOID pCallback)
+ {
+ LIMITED_METHOD_CONTRACT;
+diff --git a/src/vm/loaderallocator.cpp b/src/vm/loaderallocator.cpp
+index 70c8cab..5a3f8f5 100644
+--- a/src/vm/loaderallocator.cpp
++++ b/src/vm/loaderallocator.cpp
+@@ -1005,7 +1005,9 @@ void LoaderAllocator::Init(BaseDomain *pDomain, BYTE *pExecutableHeapMemory)
+ dwExecutableHeapReserveSize,
+ LOADERHEAP_PROFILE_COUNTER,
+ NULL,
+- TRUE /* Make heap executable */);
++ TRUE /* Make heap executable */,
++ FALSE /* Disable zero-initialization (needed by UMEntryThunkCode::Poison) */
++ );
+ initReservedMem += dwExecutableHeapReserveSize;
+ }
+
+--
+1.9.1
+
diff --git a/packaging/0011-Enable-sosplugin-on-ARM-14.patch b/packaging/0011-Enable-sosplugin-on-ARM-14.patch
new file mode 100644
index 0000000000..4a4c4f8417
--- /dev/null
+++ b/packaging/0011-Enable-sosplugin-on-ARM-14.patch
@@ -0,0 +1,134 @@
+From 9f0bbb5adf7444d187a01b84ec3ba6d99e46b86f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=EC=9D=B4=EC=B6=98=EC=84=9D/Developer=20Experience=20Lab?=
+ =?UTF-8?q?=28S/W=EC=84=BC=ED=84=B0=29/Senior=20Engineer/=EC=82=BC?=
+ =?UTF-8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= <chunseok.lee@samsung.com>
+Date: Thu, 24 Aug 2017 07:27:41 +0900
+Subject: [PATCH 11/23] Enable sosplugin on ARM (#14)
+
+* Fix CreateDump-related undefined reference on non-AMD64/Linux platforms (#11635)
+
+* Enable DacStackWalk
+
+For ARM/Linux, DacUnwindStackFrame failed to unwind stack frame due to
+the mismatch between RUNTIME_FUNCTION and IMAGE_ARM_RUNTIME_FUNCTION_ENTRY.
+
+ClrStack SOS command currently does not work due to this bug.
+
+This commit fixes this mismatch and re-enables ClrStack SOS command.
+---
+ src/ToolBox/SOS/Strike/CMakeLists.txt | 1 +
+ src/ToolBox/SOS/Strike/strike.cpp | 10 +++++-----
+ src/unwinder/arm/unwinder_arm.cpp | 14 +++++---------
+ 3 files changed, 11 insertions(+), 14 deletions(-)
+
+diff --git a/src/ToolBox/SOS/Strike/CMakeLists.txt b/src/ToolBox/SOS/Strike/CMakeLists.txt
+index ff5f864..65c3f95 100644
+--- a/src/ToolBox/SOS/Strike/CMakeLists.txt
++++ b/src/ToolBox/SOS/Strike/CMakeLists.txt
+@@ -150,6 +150,7 @@ if(CLR_CMAKE_PLATFORM_ARCH_AMD64)
+ SOS_LIBRARY
+ createdump_lib
+ )
++ add_definitions(-DCREATE_DUMP_SUPPORTED)
+ endif(CLR_CMAKE_PLATFORM_LINUX)
+ set(SOS_SOURCES_ARCH
+ disasmX86.cpp
+diff --git a/src/ToolBox/SOS/Strike/strike.cpp b/src/ToolBox/SOS/Strike/strike.cpp
+index 1fff17f..7e01635 100644
+--- a/src/ToolBox/SOS/Strike/strike.cpp
++++ b/src/ToolBox/SOS/Strike/strike.cpp
+@@ -14370,17 +14370,17 @@ _EFN_GetManagedObjectFieldInfo(
+
+ #ifdef FEATURE_PAL
+
+-#ifdef __linux__
++#ifdef CREATE_DUMP_SUPPORTED
+ #include <dumpcommon.h>
+ #include "datatarget.h"
+ extern bool CreateDumpForSOS(const char* programPath, const char* dumpPathTemplate, pid_t pid, MINIDUMP_TYPE minidumpType, ICLRDataTarget* dataTarget);
+ extern bool g_diagnostics;
+-#endif // __linux__
++#endif // CREATE_DUMP_SUPPORTED
+
+ DECLARE_API(CreateDump)
+ {
+ INIT_API();
+-#ifdef __linux__
++#ifdef CREATE_DUMP_SUPPORTED
+ StringHolder sFileName;
+ BOOL normal = FALSE;
+ BOOL withHeap = FALSE;
+@@ -14440,9 +14440,9 @@ DECLARE_API(CreateDump)
+ {
+ Status = E_FAIL;
+ }
+-#else // __linux__
++#else // CREATE_DUMP_SUPPORTED
+ ExtErr("CreateDump not supported on this platform\n");
+-#endif // __linux__
++#endif // CREATE_DUMP_SUPPORTED
+ return Status;
+ }
+
+diff --git a/src/unwinder/arm/unwinder_arm.cpp b/src/unwinder/arm/unwinder_arm.cpp
+index 6b1f686..6228b01 100644
+--- a/src/unwinder/arm/unwinder_arm.cpp
++++ b/src/unwinder/arm/unwinder_arm.cpp
+@@ -647,7 +647,7 @@ Return Value:
+ HRESULT
+ RtlpUnwindFunctionCompact(
+ __in ULONG ControlPcRva,
+- __in PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY FunctionEntry,
++ __in PT_RUNTIME_FUNCTION FunctionEntry,
+ __inout PT_CONTEXT ContextRecord,
+ __out PULONG EstablisherFrame,
+ __deref_opt_out_opt PEXCEPTION_ROUTINE *HandlerRoutine,
+@@ -917,7 +917,7 @@ HRESULT
+ RtlpUnwindFunctionFull(
+ __in ULONG ControlPcRva,
+ __in ULONG ImageBase,
+- __in PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY FunctionEntry,
++ __in PT_RUNTIME_FUNCTION FunctionEntry,
+ __inout PT_CONTEXT ContextRecord,
+ __out PULONG EstablisherFrame,
+ __deref_opt_out_opt PEXCEPTION_ROUTINE *HandlerRoutine,
+@@ -1444,7 +1444,7 @@ BOOL OOPStackUnwinderArm::Unwind(T_CONTEXT * pContext)
+ DWORD startingPc = pContext->Pc;
+ DWORD startingSp = pContext->Sp;
+
+- IMAGE_ARM_RUNTIME_FUNCTION_ENTRY Rfe;
++ T_RUNTIME_FUNCTION Rfe;
+ if (FAILED(GetFunctionEntry(DBS_EXTEND64(pContext->Pc), &Rfe, sizeof(Rfe))))
+ return FALSE;
+
+@@ -1511,17 +1511,13 @@ PEXCEPTION_ROUTINE RtlVirtualUnwind(
+ PEXCEPTION_ROUTINE handlerRoutine;
+ HRESULT res;
+
+- IMAGE_ARM_RUNTIME_FUNCTION_ENTRY rfe;
+- rfe.BeginAddress = FunctionEntry->BeginAddress;
+- rfe.UnwindData = FunctionEntry->UnwindData;
+-
+ ARM_UNWIND_PARAMS unwindParams;
+ unwindParams.ContextPointers = ContextPointers;
+
+ if ((FunctionEntry->UnwindData & 3) != 0)
+ {
+ res = RtlpUnwindFunctionCompact(ControlPc - ImageBase,
+- &rfe,
++ FunctionEntry,
+ ContextRecord,
+ EstablisherFrame,
+ &handlerRoutine,
+@@ -1533,7 +1529,7 @@ PEXCEPTION_ROUTINE RtlVirtualUnwind(
+ {
+ res = RtlpUnwindFunctionFull(ControlPc - ImageBase,
+ ImageBase,
+- &rfe,
++ FunctionEntry,
+ ContextRecord,
+ EstablisherFrame,
+ &handlerRoutine,
+--
+1.9.1
+
diff --git a/packaging/0012-Add-pie-to-linker-option-16.patch b/packaging/0012-Add-pie-to-linker-option-16.patch
new file mode 100644
index 0000000000..90ff8f9a84
--- /dev/null
+++ b/packaging/0012-Add-pie-to-linker-option-16.patch
@@ -0,0 +1,80 @@
+From b6f26e11e9a17e9a334b035ba0d7f9de5ac49b64 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=EC=9D=B4=EC=B6=98=EC=84=9D/Developer=20Experience=20Lab?=
+ =?UTF-8?q?=28S/W=EC=84=BC=ED=84=B0=29/Senior=20Engineer/=EC=82=BC?=
+ =?UTF-8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= <chunseok.lee@samsung.com>
+Date: Thu, 24 Aug 2017 07:28:09 +0900
+Subject: [PATCH 12/23] Add -pie to linker option (#16)
+
+There have been no -pie linker option.
+This patch adds -pie linker option into crossgen, ildasm, ilasm, and
+corerun, coreconsole
+---
+ src/coreclr/hosts/unixcoreconsole/CMakeLists.txt | 2 ++
+ src/coreclr/hosts/unixcorerun/CMakeLists.txt | 2 ++
+ src/ilasm/CMakeLists.txt | 2 ++
+ src/ildasm/exe/CMakeLists.txt | 1 +
+ src/tools/crossgen/CMakeLists.txt | 1 +
+ 5 files changed, 8 insertions(+)
+
+diff --git a/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt b/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt
+index 2daeaab..15d6d38 100644
+--- a/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt
++++ b/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt
+@@ -31,4 +31,6 @@ if(NOT CLR_CMAKE_PLATFORM_ANDROID)
+ )
+ endif()
+
++set_target_properties(coreconsole PROPERTIES LINK_FLAGS -pie)
++
+ install_clr(coreconsole)
+diff --git a/src/coreclr/hosts/unixcorerun/CMakeLists.txt b/src/coreclr/hosts/unixcorerun/CMakeLists.txt
+index 07beaae..85499c8 100644
+--- a/src/coreclr/hosts/unixcorerun/CMakeLists.txt
++++ b/src/coreclr/hosts/unixcorerun/CMakeLists.txt
+@@ -32,4 +32,6 @@ if(NOT CLR_CMAKE_PLATFORM_ANDROID)
+ )
+ endif()
+
++set_target_properties(corerun PROPERTIES LINK_FLAGS -pie)
++
+ install_clr(corerun)
+diff --git a/src/ilasm/CMakeLists.txt b/src/ilasm/CMakeLists.txt
+index 9e99d02..5668d1f 100644
+--- a/src/ilasm/CMakeLists.txt
++++ b/src/ilasm/CMakeLists.txt
+@@ -64,6 +64,8 @@ if(CLR_CMAKE_PLATFORM_UNIX)
+ palrt
+ )
+
++ set_target_properties(ilasm PROPERTIES LINK_FLAGS -pie)
++
+ # FreeBSD and NetBSD implement dlopen(3) in libc
+ if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+ target_link_libraries(ilasm
+diff --git a/src/ildasm/exe/CMakeLists.txt b/src/ildasm/exe/CMakeLists.txt
+index bf09be5..cfd5db0 100644
+--- a/src/ildasm/exe/CMakeLists.txt
++++ b/src/ildasm/exe/CMakeLists.txt
+@@ -54,6 +54,7 @@ if(CLR_CMAKE_PLATFORM_UNIX)
+ coreclrpal
+ palrt
+ )
++ set_target_properties(ildasm PROPERTIES LINK_FLAGS -pie)
+
+ # FreeBSD and NetBSD implement dlopen(3) in libc
+ if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+diff --git a/src/tools/crossgen/CMakeLists.txt b/src/tools/crossgen/CMakeLists.txt
+index 3b9c5ba..b8e9cf7 100644
+--- a/src/tools/crossgen/CMakeLists.txt
++++ b/src/tools/crossgen/CMakeLists.txt
+@@ -50,6 +50,7 @@ if(CLR_CMAKE_PLATFORM_UNIX)
+ coreclrpal
+ palrt
+ )
++ set_target_properties(crossgen PROPERTIES LINK_FLAGS -pie)
+ else()
+ target_link_libraries(crossgen
+ advapi32
+--
+1.9.1
+
diff --git a/packaging/0013-Revert-Add-pie-to-linker-option-16.patch b/packaging/0013-Revert-Add-pie-to-linker-option-16.patch
new file mode 100644
index 0000000000..ad21916140
--- /dev/null
+++ b/packaging/0013-Revert-Add-pie-to-linker-option-16.patch
@@ -0,0 +1,78 @@
+From e9f635587a0c8386e9bfae2013f8bda0964ea14c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=EC=9D=B4=EC=B6=98=EC=84=9D/Developer=20Experience=20Lab?=
+ =?UTF-8?q?=28S/W=EC=84=BC=ED=84=B0=29/Senior=20Engineer/=EC=82=BC?=
+ =?UTF-8?q?=EC=84=B1=EC=A0=84=EC=9E=90?= <chunseok.lee@samsung.com>
+Date: Thu, 24 Aug 2017 08:55:26 +0900
+Subject: [PATCH 13/23] Revert "Add -pie to linker option (#16)"
+
+This reverts commit c220f1608407a74c6c0f4e7145953453b0573fcb.
+---
+ src/coreclr/hosts/unixcoreconsole/CMakeLists.txt | 2 --
+ src/coreclr/hosts/unixcorerun/CMakeLists.txt | 2 --
+ src/ilasm/CMakeLists.txt | 2 --
+ src/ildasm/exe/CMakeLists.txt | 1 -
+ src/tools/crossgen/CMakeLists.txt | 1 -
+ 5 files changed, 8 deletions(-)
+
+diff --git a/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt b/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt
+index 15d6d38..2daeaab 100644
+--- a/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt
++++ b/src/coreclr/hosts/unixcoreconsole/CMakeLists.txt
+@@ -31,6 +31,4 @@ if(NOT CLR_CMAKE_PLATFORM_ANDROID)
+ )
+ endif()
+
+-set_target_properties(coreconsole PROPERTIES LINK_FLAGS -pie)
+-
+ install_clr(coreconsole)
+diff --git a/src/coreclr/hosts/unixcorerun/CMakeLists.txt b/src/coreclr/hosts/unixcorerun/CMakeLists.txt
+index 85499c8..07beaae 100644
+--- a/src/coreclr/hosts/unixcorerun/CMakeLists.txt
++++ b/src/coreclr/hosts/unixcorerun/CMakeLists.txt
+@@ -32,6 +32,4 @@ if(NOT CLR_CMAKE_PLATFORM_ANDROID)
+ )
+ endif()
+
+-set_target_properties(corerun PROPERTIES LINK_FLAGS -pie)
+-
+ install_clr(corerun)
+diff --git a/src/ilasm/CMakeLists.txt b/src/ilasm/CMakeLists.txt
+index 5668d1f..9e99d02 100644
+--- a/src/ilasm/CMakeLists.txt
++++ b/src/ilasm/CMakeLists.txt
+@@ -64,8 +64,6 @@ if(CLR_CMAKE_PLATFORM_UNIX)
+ palrt
+ )
+
+- set_target_properties(ilasm PROPERTIES LINK_FLAGS -pie)
+-
+ # FreeBSD and NetBSD implement dlopen(3) in libc
+ if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+ target_link_libraries(ilasm
+diff --git a/src/ildasm/exe/CMakeLists.txt b/src/ildasm/exe/CMakeLists.txt
+index cfd5db0..bf09be5 100644
+--- a/src/ildasm/exe/CMakeLists.txt
++++ b/src/ildasm/exe/CMakeLists.txt
+@@ -54,7 +54,6 @@ if(CLR_CMAKE_PLATFORM_UNIX)
+ coreclrpal
+ palrt
+ )
+- set_target_properties(ildasm PROPERTIES LINK_FLAGS -pie)
+
+ # FreeBSD and NetBSD implement dlopen(3) in libc
+ if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
+diff --git a/src/tools/crossgen/CMakeLists.txt b/src/tools/crossgen/CMakeLists.txt
+index b8e9cf7..3b9c5ba 100644
+--- a/src/tools/crossgen/CMakeLists.txt
++++ b/src/tools/crossgen/CMakeLists.txt
+@@ -50,7 +50,6 @@ if(CLR_CMAKE_PLATFORM_UNIX)
+ coreclrpal
+ palrt
+ )
+- set_target_properties(crossgen PROPERTIES LINK_FLAGS -pie)
+ else()
+ target_link_libraries(crossgen
+ advapi32
+--
+1.9.1
+
diff --git a/packaging/0014-Fix-inconsistency-between-GetHasCode-and-Equals-1351.patch b/packaging/0014-Fix-inconsistency-between-GetHasCode-and-Equals-1351.patch
new file mode 100644
index 0000000000..0de7bc3f50
--- /dev/null
+++ b/packaging/0014-Fix-inconsistency-between-GetHasCode-and-Equals-1351.patch
@@ -0,0 +1,35 @@
+From 6b2a3ed5103ca11bb928ccf94b6b50bfdbb3d115 Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Wed, 23 Aug 2017 05:56:01 +0900
+Subject: [PATCH 14/23] Fix inconsistency between GetHasCode and Equals
+ (#13513)
+
+---
+ src/mscorlib/src/System/MulticastDelegate.cs | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/src/mscorlib/src/System/MulticastDelegate.cs b/src/mscorlib/src/System/MulticastDelegate.cs
+index 988bf2b..1d701f0 100644
+--- a/src/mscorlib/src/System/MulticastDelegate.cs
++++ b/src/mscorlib/src/System/MulticastDelegate.cs
+@@ -452,6 +452,17 @@ namespace System
+ if (IsUnmanagedFunctionPtr())
+ return ValueType.GetHashCodeOfPtr(_methodPtr) ^ ValueType.GetHashCodeOfPtr(_methodPtrAux);
+
++ if (_invocationCount != (IntPtr)0)
++ {
++ var t = _invocationList as Delegate;
++
++ if (t != null)
++ {
++ // this is a secure/wrapper delegate so we need to unwrap and check the inner one
++ return t.GetHashCode();
++ }
++ }
++
+ Object[] invocationList = _invocationList as Object[];
+ if (invocationList == null)
+ {
+--
+1.9.1
+
diff --git a/packaging/0015-Cherry-pick-13586.patch b/packaging/0015-Cherry-pick-13586.patch
new file mode 100644
index 0000000000..c9fb518fe6
--- /dev/null
+++ b/packaging/0015-Cherry-pick-13586.patch
@@ -0,0 +1,170 @@
+From 275abfda0a2ba0bf70ca6d16a1fc13b9453c2b49 Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Tue, 29 Aug 2017 10:11:24 +0900
+Subject: [PATCH 15/23] Cherry-pick #13586
+
+---
+ src/ToolBox/SOS/Strike/strike.cpp | 31 ++++++++++++++++++-------------
+ src/ToolBox/SOS/Strike/util.h | 7 +++++--
+ 2 files changed, 23 insertions(+), 15 deletions(-)
+
+diff --git a/src/ToolBox/SOS/Strike/strike.cpp b/src/ToolBox/SOS/Strike/strike.cpp
+index 7e01635..2e20b28 100644
+--- a/src/ToolBox/SOS/Strike/strike.cpp
++++ b/src/ToolBox/SOS/Strike/strike.cpp
+@@ -320,15 +320,20 @@ DECLARE_API(IP2MD)
+ // (MAX_STACK_FRAMES is also used by x86 to prevent infinite loops in _EFN_StackTrace)
+ #define MAX_STACK_FRAMES 1000
+
+-#ifdef _TARGET_WIN64_
++#if defined(_TARGET_WIN64_)
++#define DEBUG_STACK_CONTEXT AMD64_CONTEXT
++#elif defined(_TARGET_ARM_) // _TARGET_WIN64_
++#define DEBUG_STACK_CONTEXT ARM_CONTEXT
++#endif // _TARGET_ARM_
+
++#ifdef DEBUG_STACK_CONTEXT
+ // I use a global set of frames for stack walking on win64 because the debugger's
+ // GetStackTrace function doesn't provide a way to find out the total size of a stackwalk,
+ // and I'd like to have a reasonably big maximum without overflowing the stack by declaring
+ // the buffer locally and I also want to get a managed trace in a low memory environment
+ // (so no dynamic allocation if possible).
+ DEBUG_STACK_FRAME g_Frames[MAX_STACK_FRAMES];
+-AMD64_CONTEXT g_X64FrameContexts[MAX_STACK_FRAMES];
++DEBUG_STACK_CONTEXT g_FrameContexts[MAX_STACK_FRAMES];
+
+ static HRESULT
+ GetContextStackTrace(PULONG pnumFrames)
+@@ -339,7 +344,7 @@ GetContextStackTrace(PULONG pnumFrames)
+ // Do we have advanced capability?
+ if ((hr = g_ExtControl->QueryInterface(__uuidof(IDebugControl4), (void **)&debugControl4)) == S_OK)
+ {
+- // GetContextStackTrace fills g_X64FrameContexts as an array of
++ // GetContextStackTrace fills g_FrameContexts as an array of
+ // contexts packed as target architecture contexts. We cannot
+ // safely cast this as an array of CROSS_PLATFORM_CONTEXT, since
+ // sizeof(CROSS_PLATFORM_CONTEXT) != sizeof(TGT_CONTEXT)
+@@ -348,7 +353,7 @@ GetContextStackTrace(PULONG pnumFrames)
+ 0,
+ g_Frames,
+ MAX_STACK_FRAMES,
+- g_X64FrameContexts,
++ g_FrameContexts,
+ MAX_STACK_FRAMES*g_targetMachine->GetContextSize(),
+ g_targetMachine->GetContextSize(),
+ pnumFrames);
+@@ -358,7 +363,7 @@ GetContextStackTrace(PULONG pnumFrames)
+ return hr;
+ }
+
+-#endif // _TARGET_WIN64_
++#endif // DEBUG_STACK_CONTEXT
+
+ /**********************************************************************\
+ * Routine Description: *
+@@ -12040,7 +12045,7 @@ public:
+ return;
+ }
+
+-#ifdef _TARGET_WIN64_
++#ifdef DEBUG_STACK_CONTEXT
+ PDEBUG_STACK_FRAME currentNativeFrame = NULL;
+ ULONG numNativeFrames = 0;
+ if (bFull)
+@@ -12053,7 +12058,7 @@ public:
+ }
+ currentNativeFrame = &g_Frames[0];
+ }
+-#endif // _TARGET_WIN64_
++#endif // DEBUG_STACK_CONTEXT
+
+ unsigned int refCount = 0, errCount = 0;
+ ArrayHolder<SOSStackRefData> pRefs = NULL;
+@@ -12079,7 +12084,7 @@ public:
+ if (SUCCEEDED(frameDataResult) && FrameData.frameAddr)
+ sp = FrameData.frameAddr;
+
+-#ifdef _TARGET_WIN64_
++#ifdef DEBUG_STACK_CONTEXT
+ while ((numNativeFrames > 0) && (currentNativeFrame->StackOffset <= sp))
+ {
+ if (currentNativeFrame->StackOffset != sp)
+@@ -12089,7 +12094,7 @@ public:
+ currentNativeFrame++;
+ numNativeFrames--;
+ }
+-#endif // _TARGET_WIN64_
++#endif // DEBUG_STACK_CONTEXT
+
+ // Print the stack pointer.
+ out.WriteColumn(0, sp);
+@@ -12138,14 +12143,14 @@ public:
+
+ } while (pStackWalk->Next() == S_OK);
+
+-#ifdef _TARGET_WIN64_
++#ifdef DEBUG_STACK_CONTEXT
+ while (numNativeFrames > 0)
+ {
+ PrintNativeStackFrame(out, currentNativeFrame, bSuppressLines);
+ currentNativeFrame++;
+ numNativeFrames--;
+ }
+-#endif // _TARGET_WIN64_
++#endif // DEBUG_STACK_CONTEXT
+ }
+
+ static HRESULT PrintManagedFrameContext(IXCLRDataStackWalk *pStackWalk)
+@@ -13321,7 +13326,7 @@ HRESULT CALLBACK ImplementEFNStackTrace(
+ {
+ // below we cast the i-th AMD64_CONTEXT to CROSS_PLATFORM_CONTEXT
+ AppendContext (pTransitionContexts, *puiTransitionContextCount,
+- &transitionContextCount, uiSizeOfContext, (CROSS_PLATFORM_CONTEXT*)(&(g_X64FrameContexts[i])));
++ &transitionContextCount, uiSizeOfContext, (CROSS_PLATFORM_CONTEXT*)(&(g_FrameContexts[i])));
+ }
+ else
+ {
+@@ -13354,7 +13359,7 @@ HRESULT CALLBACK ImplementEFNStackTrace(
+ if (puiTransitionContextCount)
+ {
+ AppendContext (pTransitionContexts, *puiTransitionContextCount,
+- &transitionContextCount, uiSizeOfContext, (CROSS_PLATFORM_CONTEXT*)(&(g_X64FrameContexts[i])));
++ &transitionContextCount, uiSizeOfContext, (CROSS_PLATFORM_CONTEXT*)(&(g_FrameContexts[i])));
+ }
+ else
+ {
+diff --git a/src/ToolBox/SOS/Strike/util.h b/src/ToolBox/SOS/Strike/util.h
+index 6d0e796..bbf97b9 100644
+--- a/src/ToolBox/SOS/Strike/util.h
++++ b/src/ToolBox/SOS/Strike/util.h
+@@ -2519,8 +2519,8 @@ typedef struct{
+
+ /// ARM Context
+ #define ARM_MAX_BREAKPOINTS_CONST 8
+-#define ARM_MAX_WATCHPOINTS_CONST 4
+-typedef struct {
++#define ARM_MAX_WATCHPOINTS_CONST 1
++typedef DECLSPEC_ALIGN(8) struct {
+
+ DWORD ContextFlags;
+
+@@ -2544,6 +2544,7 @@ typedef struct {
+ DWORD Cpsr;
+
+ DWORD Fpscr;
++ DWORD Padding;
+ union {
+ M128A_XPLAT Q[16];
+ ULONGLONG D[32];
+@@ -2555,6 +2556,8 @@ typedef struct {
+ DWORD Wvr[ARM_MAX_WATCHPOINTS_CONST];
+ DWORD Wcr[ARM_MAX_WATCHPOINTS_CONST];
+
++ DWORD Padding2[2];
++
+ } ARM_CONTEXT;
+
+ // On ARM this mask is or'ed with the address of code to get an instruction pointer
+--
+1.9.1
+
diff --git a/packaging/0016-callsignalhandlerwrapper-patch.patch b/packaging/0016-callsignalhandlerwrapper-patch.patch
new file mode 100644
index 0000000000..8fb92abda4
--- /dev/null
+++ b/packaging/0016-callsignalhandlerwrapper-patch.patch
@@ -0,0 +1,51 @@
+From 8e38cfbaf45147c4361123a306d5b50c667a899e Mon Sep 17 00:00:00 2001
+From: CHUNSEOK LEE <chunseok.lee@samsung.com>
+Date: Wed, 2 Aug 2017 09:02:14 +0900
+Subject: [PATCH 16/23] callsignalhandlerwrapper patch
+
+Change-Id: I38630f9d02733aab5890b46afda39fd6e45461db
+---
+ src/pal/src/arch/arm/callsignalhandlerwrapper.S | 10 ++++++----
+ src/pal/src/arch/arm/signalhandlerhelper.cpp | 2 ++
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/src/pal/src/arch/arm/callsignalhandlerwrapper.S b/src/pal/src/arch/arm/callsignalhandlerwrapper.S
+index 266e4fd..b6288c4 100644
+--- a/src/pal/src/arch/arm/callsignalhandlerwrapper.S
++++ b/src/pal/src/arch/arm/callsignalhandlerwrapper.S
+@@ -18,12 +18,14 @@ C_FUNC(SignalHandlerWorkerReturnOffset\Alignment):
+ // address set to SignalHandlerWorkerReturn during SIGSEGV handling.
+ // It enables the unwinder to unwind stack from the handling code to the actual failure site.
+ NESTED_ENTRY CallSignalHandlerWrapper\Alignment, _TEXT, NoHandler
+- sub sp, sp, #(8 + \Alignment) // red zone + alignment
+- stmfd sp!, {r7, lr}
++ alloc_stack (8 + \Alignment)
++// PROLOG_PUSH "{r7, lr}"
++ .save {r7, r11, lr, pc}
+ bl EXTERNAL_C_FUNC(signal_handler_worker)
+ LOCAL_LABEL(SignalHandlerWorkerReturn\Alignment):
+- ldmfd sp!, {r7, lr}
+- bx lr
++// EPILOG_POP "{r7, lr}"
++// free_stack (8 + \Alignment)
++// bx lr
+ NESTED_END CallSignalHandlerWrapper\Alignment, _TEXT
+
+ .endm
+diff --git a/src/pal/src/arch/arm/signalhandlerhelper.cpp b/src/pal/src/arch/arm/signalhandlerhelper.cpp
+index e1ad460..3936204 100644
+--- a/src/pal/src/arch/arm/signalhandlerhelper.cpp
++++ b/src/pal/src/arch/arm/signalhandlerhelper.cpp
+@@ -48,7 +48,9 @@ void ExecuteHandlerOnOriginalStack(int code, siginfo_t *siginfo, void *context,
+ // Build fake stack frame to enable the stack unwinder to unwind from signal_handler_worker to the faulting instruction
+ // pushed LR
+ *--sp = (size_t)MCREG_Pc(ucontext->uc_mcontext);
++ *--sp = (size_t)MCREG_Lr(ucontext->uc_mcontext);
+ // pushed frame pointer
++ *--sp = (size_t)MCREG_R11(ucontext->uc_mcontext);
+ *--sp = (size_t)MCREG_R7(ucontext->uc_mcontext);
+
+ // Switch the current context to the signal_handler_worker and the original stack
+--
+1.9.1
+
diff --git a/packaging/0017-clear-cache-after-NI-reloc.patch b/packaging/0017-clear-cache-after-NI-reloc.patch
new file mode 100644
index 0000000000..6bb74f5791
--- /dev/null
+++ b/packaging/0017-clear-cache-after-NI-reloc.patch
@@ -0,0 +1,25 @@
+From 2427902ddfff7dd868b79d95865afee5c3a257c4 Mon Sep 17 00:00:00 2001
+From: CHUNSEOK LEE <chunseok.lee@samsung.com>
+Date: Fri, 25 Aug 2017 09:50:17 +0900
+Subject: [PATCH 17/23] clear cache after NI reloc
+
+---
+ src/vm/peimagelayout.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/vm/peimagelayout.cpp b/src/vm/peimagelayout.cpp
+index 34ba4d8..5dc0e64 100644
+--- a/src/vm/peimagelayout.cpp
++++ b/src/vm/peimagelayout.cpp
+@@ -227,6 +227,8 @@ void PEImageLayout::ApplyBaseRelocations()
+ #ifdef _TARGET_ARM_
+ case IMAGE_REL_BASED_THUMB_MOV32:
+ PutThumb2Mov32((UINT16 *)address, GetThumb2Mov32((UINT16 *)address) + delta);
++
++ ClrFlushInstructionCache(address, 8);
+ break;
+ #endif
+
+--
+1.9.1
+
diff --git a/packaging/0018-Support-FEATURE_GDBJIT_FRAME-including-NI-IL_Stub.patch b/packaging/0018-Support-FEATURE_GDBJIT_FRAME-including-NI-IL_Stub.patch
new file mode 100644
index 0000000000..2b03965319
--- /dev/null
+++ b/packaging/0018-Support-FEATURE_GDBJIT_FRAME-including-NI-IL_Stub.patch
@@ -0,0 +1,1439 @@
+From d88953cc229dcbf5d93aa04711ee599b3d073094 Mon Sep 17 00:00:00 2001
+From: Jonghyun Park <parjong@gmail.com>
+Date: Tue, 8 Aug 2017 01:27:16 +0900
+Subject: [PATCH 18/23] Support FEATURE_GDBJIT_FRAME (including NI & IL_Stub)
+
+---
+ src/vm/CMakeLists.txt | 3 +
+ src/vm/gdbjit.cpp | 1108 ++++++++++++++++++++++++++++++++++---------------
+ src/vm/gdbjit.h | 13 +-
+ src/vm/prestub.cpp | 29 +-
+ src/vm/util.cpp | 10 +-
+ 5 files changed, 813 insertions(+), 350 deletions(-)
+
+diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt
+index c610d3c..835e31c 100644
+--- a/src/vm/CMakeLists.txt
++++ b/src/vm/CMakeLists.txt
+@@ -31,6 +31,9 @@ if(FEATURE_GDBJIT)
+ )
+ add_definitions(-DFEATURE_GDBJIT)
+ endif(FEATURE_GDBJIT)
++if(FEATURE_GDBJIT_FRAME)
++ add_definitions(-DFEATURE_GDBJIT_FRAME)
++endif(FEATURE_GDBJIT_FRAME)
+
+ set(VM_SOURCES_DAC_AND_WKS_COMMON
+ appdomain.cpp
+diff --git a/src/vm/gdbjit.cpp b/src/vm/gdbjit.cpp
+index ace6b76..5a3f074 100644
+--- a/src/vm/gdbjit.cpp
++++ b/src/vm/gdbjit.cpp
+@@ -648,46 +648,6 @@ struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 };
+
+ // END of GDB JIT interface
+
+-/* Predefined section names */
+-const char* SectionNames[] = {
+- "",
+- ".text",
+- ".shstrtab",
+- ".debug_str",
+- ".debug_abbrev",
+- ".debug_info",
+- ".debug_pubnames",
+- ".debug_pubtypes",
+- ".debug_line",
+- ".symtab",
+- ".strtab"
+- /* After the last (.strtab) section zero or more .thunk_* sections are generated.
+-
+- Each .thunk_* section contains a single .thunk_#.
+- These symbols are mapped to methods (or trampolines) called by currently compiled method. */
+-};
+-
+-const int SectionNamesCount = sizeof(SectionNames) / sizeof(SectionNames[0]); // Does not include .thunk_* sections
+-
+-/* Static data for section headers */
+-struct SectionHeader {
+- uint32_t m_type;
+- uint64_t m_flags;
+-} Sections[] = {
+- {SHT_NULL, 0},
+- {SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR},
+- {SHT_STRTAB, 0},
+- {SHT_PROGBITS, SHF_MERGE | SHF_STRINGS },
+- {SHT_PROGBITS, 0},
+- {SHT_PROGBITS, 0},
+- {SHT_PROGBITS, 0},
+- {SHT_PROGBITS, 0},
+- {SHT_PROGBITS, 0},
+- {SHT_SYMTAB, 0},
+- {SHT_STRTAB, 0},
+- {SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR}
+-};
+-
+ /* Static data for .debug_str section */
+ const char* DebugStrings[] = {
+ "CoreCLR", "" /* module name */, "" /* module path */
+@@ -1748,8 +1708,661 @@ static int getNextPrologueIndex(int from, const SymbolsInfo *lines, int nlines)
+ return -1;
+ }
+
++static inline bool isListedModule(const WCHAR *wszModuleFile)
++{
++ static NewArrayHolder<WCHAR> wszModuleNames = nullptr;
++ static DWORD cBytesNeeded = 0;
++
++ // Get names of interesting modules from environment
++ if (wszModuleNames == nullptr && cBytesNeeded == 0)
++ {
++ DWORD cCharsNeeded = GetEnvironmentVariableW(W("CORECLR_GDBJIT"), NULL, 0);
++
++ if (cCharsNeeded == 0)
++ {
++ cBytesNeeded = 0xffffffff;
++ return false;
++ }
++
++ WCHAR *wszModuleNamesBuf = new WCHAR[cCharsNeeded+1];
++
++ cCharsNeeded = GetEnvironmentVariableW(W("CORECLR_GDBJIT"), wszModuleNamesBuf, cCharsNeeded);
++
++ if (cCharsNeeded == 0)
++ {
++ delete[] wszModuleNamesBuf;
++ cBytesNeeded = 0xffffffff;
++ return false;
++ }
++
++ wszModuleNames = wszModuleNamesBuf;
++ cBytesNeeded = cCharsNeeded + 1;
++ }
++ else if (wszModuleNames == nullptr)
++ {
++ return false;
++ }
++
++ _ASSERTE(wszModuleNames != nullptr && cBytesNeeded > 0);
++
++ BOOL isUserDebug = FALSE;
++
++ NewArrayHolder<WCHAR> wszModuleName = new WCHAR[cBytesNeeded];
++ LPWSTR pComma = wcsstr(wszModuleNames, W(","));
++ LPWSTR tmp = wszModuleNames;
++
++ while (pComma != NULL)
++ {
++ wcsncpy(wszModuleName, tmp, pComma - tmp);
++ wszModuleName[pComma - tmp] = W('\0');
++
++ if (wcscmp(wszModuleName, wszModuleFile) == 0)
++ {
++ isUserDebug = TRUE;
++ break;
++ }
++ tmp = pComma + 1;
++ pComma = wcsstr(tmp, W(","));
++ }
++ if (isUserDebug == FALSE)
++ {
++ wcsncpy(wszModuleName, tmp, wcslen(tmp));
++ wszModuleName[wcslen(tmp)] = W('\0');
++ if (wcscmp(wszModuleName, wszModuleFile) == 0)
++ {
++ isUserDebug = TRUE;
++ }
++ }
++
++ return isUserDebug;
++}
++
+ static NotifyGdb::AddrSet codeAddrs;
+
++class Elf_SectionTracker
++{
++ private:
++ unsigned int m_Flag;
++
++ private:
++ NewArrayHolder<char> m_NamePtr;
++ unsigned int m_NameLen;
++
++ private:
++ unsigned int m_Ind;
++ unsigned int m_Off;
++ unsigned int m_Len;
++
++ private:
++ Elf_Shdr m_Hdr;
++
++ private:
++ Elf_SectionTracker *m_Next;
++
++ public:
++ Elf_SectionTracker(const char *name, unsigned ind, unsigned off, uint32_t type, uint64_t flags);
++ ~Elf_SectionTracker();
++
++ public:
++ bool NeedHeaderUpdate() const;
++ void DisableHeaderUpdate();
++
++ public:
++ unsigned int GetIndex() const { return m_Ind; }
++ unsigned int GetOffset() const { return m_Off; }
++ unsigned int GetSize() const { return m_Len; }
++
++ public:
++ const char *GetName() const { return m_NamePtr; }
++ unsigned int GetNameLen() const { return m_NameLen; }
++
++ public:
++ Elf_SectionTracker *GetNext(void);
++ void SetNext(Elf_SectionTracker *next);
++
++ public:
++ void Forward(unsigned int len);
++
++ public:
++ Elf_Shdr *Header(void);
++ const Elf_Shdr *Header(void) const;
++
++};
++
++Elf_SectionTracker::Elf_SectionTracker(const char *name,
++ unsigned ind, unsigned off,
++ uint32_t type, uint64_t flags)
++ : m_Flag(0),
++ m_NamePtr(nullptr),
++ m_NameLen(0),
++ m_Ind(ind),
++ m_Off(off),
++ m_Len(0),
++ m_Next(nullptr)
++{
++ if (name)
++ {
++ unsigned int len = strlen(name);
++ char *ptr = new char[len + 1];
++
++ strncpy(ptr, name, len + 1);
++
++ m_NamePtr = ptr;
++ m_NameLen = len;
++ }
++
++ m_Hdr.sh_type = type;
++ m_Hdr.sh_flags = flags;
++ m_Hdr.sh_name = 0;
++ m_Hdr.sh_addr = 0;
++ m_Hdr.sh_offset = 0;
++ m_Hdr.sh_size = 0;
++ m_Hdr.sh_link = SHN_UNDEF;
++ m_Hdr.sh_info = 0;
++ m_Hdr.sh_addralign = 1;
++ m_Hdr.sh_entsize = 0;
++}
++
++Elf_SectionTracker::~Elf_SectionTracker()
++{
++}
++
++#define ESTF_NO_HEADER_UPDATE 0x00000001
++
++bool Elf_SectionTracker::NeedHeaderUpdate() const
++{
++ return !(m_Flag & ESTF_NO_HEADER_UPDATE);
++}
++
++void Elf_SectionTracker::DisableHeaderUpdate()
++{
++ m_Flag |= ESTF_NO_HEADER_UPDATE;
++}
++
++void Elf_SectionTracker::Forward(unsigned int len)
++{
++ m_Len += len;
++}
++
++void Elf_SectionTracker::SetNext(Elf_SectionTracker *next)
++{
++ m_Next = next;
++}
++
++Elf_SectionTracker *Elf_SectionTracker::GetNext(void)
++{
++ return m_Next;
++}
++
++Elf_Shdr *Elf_SectionTracker::Header(void)
++{
++ return &m_Hdr;
++}
++
++const Elf_Shdr *Elf_SectionTracker::Header(void) const
++{
++ return &m_Hdr;
++}
++
++class Elf_Buffer
++{
++ private:
++ NewArrayHolder<char> m_Ptr;
++ unsigned int m_Len;
++ unsigned int m_Pos;
++
++ public:
++ Elf_Buffer(unsigned int len);
++
++ private:
++ char *Ensure(unsigned int len);
++ void Forward(unsigned int len);
++
++ public:
++ unsigned int GetPos() const
++ {
++ return m_Pos;
++ }
++
++ char *GetPtr(unsigned int off = 0)
++ {
++ return m_Ptr.GetValue() + off;
++ }
++
++ public:
++ char *Reserve(unsigned int len);
++ template <typename T> T *ReserveT(unsigned int len = sizeof(T))
++ {
++ _ASSERTE(len >= sizeof(T));
++ return reinterpret_cast<T *>(Reserve(len));
++ }
++
++ public:
++ void Append(const char *src, unsigned int len);
++ template <typename T> void AppendT(T *src)
++ {
++ Append(reinterpret_cast<const char *>(src), sizeof(T));
++ }
++};
++
++Elf_Buffer::Elf_Buffer(unsigned int len)
++ : m_Ptr(new char[len])
++ , m_Len(len)
++ , m_Pos(0)
++{
++}
++
++char *Elf_Buffer::Ensure(unsigned int len)
++{
++ bool bAdjusted = false;
++
++ while (m_Pos + len > m_Len)
++ {
++ m_Len *= 2;
++ bAdjusted = true;
++ }
++
++ if (bAdjusted)
++ {
++ char *ptr = new char [m_Len * 2];
++ memcpy(ptr, m_Ptr.GetValue(), m_Pos);
++ m_Ptr = ptr;
++ }
++
++ return GetPtr(m_Pos);
++}
++
++void Elf_Buffer::Forward(unsigned int len)
++{
++ m_Pos += len;
++}
++
++char *Elf_Buffer::Reserve(unsigned int len)
++{
++ char *ptr = Ensure(len);
++ Forward(len);
++ return ptr;
++}
++
++void Elf_Buffer::Append(const char *src, unsigned int len)
++{
++ char *dst = Reserve(len);
++ memcpy(dst, src, len);
++}
++
++#define ELF_BUILDER_TEXT_SECTION_INDEX 1
++
++class Elf_Builder
++{
++ private:
++ Elf_Buffer m_Buffer;
++
++ private:
++ unsigned int m_SectionCount;
++ Elf_SectionTracker *m_First;
++ Elf_SectionTracker *m_Last;
++ Elf_SectionTracker *m_Curr;
++
++ public:
++ Elf_Builder();
++ ~Elf_Builder();
++
++ public:
++ unsigned int GetSectionCount(void) { return m_SectionCount; }
++
++ public:
++ void Initialize(PCODE codePtr, TADDR codeLen);
++
++ public:
++ Elf_SectionTracker *OpenSection(const char *name, uint32_t type, uint64_t flags);
++ void CloseSection();
++
++ public:
++ char *Reserve(unsigned int len);
++ template <typename T> T *ReserveT(unsigned int len = sizeof(T))
++ {
++ _ASSERTE(len >= sizeof(T));
++ return reinterpret_cast<T *>(Reserve(len));
++ }
++
++ public:
++ void Append(const char *src, unsigned int len);
++ template <typename T> void AppendT(T *src)
++ {
++ Append(reinterpret_cast<const char *>(src), sizeof(T));
++ }
++
++ public:
++ void Finalize(void);
++
++ public:
++ char *Export(UINT64 *len);
++};
++
++Elf_Builder::Elf_Builder()
++ : m_Buffer(128),
++ m_SectionCount(0),
++ m_First(nullptr),
++ m_Last(nullptr),
++ m_Curr(nullptr)
++{
++}
++
++Elf_Builder::~Elf_Builder()
++{
++ Elf_SectionTracker *curr = m_First;
++
++ while (curr)
++ {
++ Elf_SectionTracker *next = curr->GetNext();
++ delete curr;
++ curr = next;
++ }
++}
++
++void Elf_Builder::Initialize(PCODE codePtr, TADDR codeLen)
++{
++ //
++ // Reserve ELF Header
++ //
++ m_Buffer.Reserve(sizeof(Elf_Ehdr));
++
++ //
++ // Create NULL section
++ //
++ Elf_SectionTracker *null = OpenSection("", SHT_NULL, 0);
++ {
++ null->DisableHeaderUpdate();
++ null->Header()->sh_addralign = 0;
++ }
++ CloseSection();
++
++ //
++ // Create '.text' section
++ //
++ Elf_SectionTracker *text = OpenSection(".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);
++ {
++ text->DisableHeaderUpdate();
++ text->Header()->sh_addr = codePtr;
++ text->Header()->sh_size = codeLen;
++
++ _ASSERTE(text->GetIndex() == ELF_BUILDER_TEXT_SECTION_INDEX);
++ }
++ CloseSection();
++}
++
++char *Elf_Builder::Reserve(unsigned int len)
++{
++ _ASSERTE(m_Curr != nullptr && "Section should be opened before");
++ char *ptr = m_Buffer.Reserve(len);
++ m_Curr->Forward(len);
++ return ptr;
++}
++
++void Elf_Builder::Append(const char *src, unsigned int len)
++{
++ _ASSERTE(m_Curr != nullptr && "Section should be opened before");
++ char *dst = Reserve(len);
++ memcpy(dst, src, len);
++}
++
++Elf_SectionTracker *Elf_Builder::OpenSection(const char *name, uint32_t type, uint64_t flags)
++{
++ _ASSERTE(m_Curr == nullptr && "Section should be closed before");
++
++ Elf_SectionTracker *next = new Elf_SectionTracker(name, m_SectionCount, m_Buffer.GetPos(), type, flags);
++
++ if (m_First == NULL)
++ {
++ m_First = next;
++ }
++
++ if (m_Last != NULL)
++ {
++ m_Last->SetNext(next);
++ }
++
++ m_SectionCount++;
++
++ m_Last = next;
++ m_Curr = next;
++
++ return next;
++}
++
++void Elf_Builder::CloseSection()
++{
++ _ASSERTE(m_Curr != nullptr && "Section should be opened before");
++ m_Curr = nullptr;
++}
++
++char *Elf_Builder::Export(UINT64 *pLen)
++{
++ unsigned int len = m_Buffer.GetPos();
++ const char *src = m_Buffer.GetPtr();
++ char *dst = new char[len];
++
++ memcpy(dst, src, len);
++
++ if (pLen)
++ {
++ *pLen = len;
++ }
++
++ return dst;
++}
++
++void Elf_Builder::Finalize()
++{
++ //
++ // Create '.shstrtab'
++ //
++ Elf_SectionTracker *shstrtab = OpenSection(".shstrtab", SHT_STRTAB, 0);
++ {
++ Elf_SectionTracker *curr = m_First;
++
++ while (curr)
++ {
++ unsigned int off = shstrtab->GetSize();
++ unsigned int len = curr->GetNameLen();
++
++ char *dst = Reserve(len + 1);
++ memcpy(dst, curr->GetName(), len);
++ dst[len] = '\0';
++
++ curr->Header()->sh_name = off;
++
++ curr = curr->GetNext();
++ }
++ }
++ CloseSection();
++
++ //
++ // Create Section Header(s) Table
++ //
++ unsigned int shtOffset = m_Buffer.GetPos();
++ {
++ Elf_SectionTracker *curr = m_First;
++
++ while (curr)
++ {
++ if (curr->NeedHeaderUpdate())
++ {
++ curr->Header()->sh_offset = curr->GetOffset();
++ curr->Header()->sh_size = curr->GetSize();
++ }
++ m_Buffer.AppendT(curr->Header());
++ curr = curr->GetNext();
++ }
++ }
++
++ //
++ // Update ELF Header
++ //
++ Elf_Ehdr *elfHeader = new (m_Buffer.GetPtr()) Elf_Ehdr;
++
++#ifdef _TARGET_ARM_
++ elfHeader->e_flags = EF_ARM_EABI_VER5;
++#ifdef ARM_SOFTFP
++ elfHeader->e_flags |= EF_ARM_SOFT_FLOAT;
++#else
++ elfHeader->e_flags |= EF_ARM_VFP_FLOAT;
++#endif
++#endif
++ elfHeader->e_shoff = shtOffset;
++ elfHeader->e_shentsize = sizeof(Elf_Shdr);
++ elfHeader->e_shnum = m_SectionCount;
++ elfHeader->e_shstrndx = shstrtab->GetIndex();
++}
++
++#ifdef FEATURE_GDBJIT_FRAME
++struct __attribute__((packed)) Length
++{
++ UINT32 value;
++
++ Length &operator=(UINT32 n)
++ {
++ value = n;
++ return *this;
++ }
++
++ Length()
++ {
++ value = 0;
++ }
++};
++
++struct __attribute__((packed)) CIE
++{
++ Length length;
++ UINT32 id;
++ UINT8 version;
++ UINT8 augmentation;
++ UINT8 code_alignment_factor;
++ INT8 data_alignment_factor;
++ UINT8 return_address_register;
++ UINT8 instructions[0];
++};
++
++struct __attribute__((packed)) FDE
++{
++ Length length;
++ UINT32 cie;
++ PCODE initial_location;
++ TADDR address_range;
++ UINT8 instructions[0];
++};
++
++static void BuildDebugFrame(Elf_Builder &elfBuilder, PCODE pCode, TADDR codeSize)
++{
++#if defined(_TARGET_ARM_)
++ const unsigned int code_alignment_factor = 2;
++ const int data_alignment_factor = -4;
++
++ UINT8 cieCode[] = {
++ // DW_CFA_def_cfa 13[sp], 0
++ 0x0c, 0x0d, 0x00,
++ };
++
++ UINT8 fdeCode[] = {
++ // DW_CFA_advance_loc 1
++ 0x02, 0x01,
++ // DW_CFA_def_cfa_offset 8
++ 0x0e, 0x08,
++ // DW_CFA_offset 11(r11), -8(= -4 * 2)
++ (0x02 << 6) | 0x0b, 0x02,
++ // DW_CFA_offset 14(lr), -4(= -4 * 1)
++ (0x02 << 6) | 0x0e, 0x01,
++ // DW_CFA_def_cfa_register 11(r11)
++ 0x0d, 0x0b,
++ };
++#elif defined(_TARGET_X86_)
++ const unsigned int code_alignment_factor = 1;
++ const int data_alignment_factor = -4;
++
++ UINT8 cieCode[] = {
++ // DW_CFA_def_cfa 4(esp), 4
++ 0x0c, 0x04, 0x04,
++ // DW_CFA_offset 8(eip), -4(= -4 * 1)
++ (0x02 << 6) | 0x08, 0x01,
++ };
++
++ UINT8 fdeCode[] = {
++ // DW_CFA_advance_loc 1
++ 0x02, 0x01,
++ // DW_CFA_def_cfa_offset 8
++ 0x0e, 0x08,
++ // DW_CFA_offset 5(ebp), -8(= -4 * 2)
++ (0x02 << 6) | 0x05, 0x02,
++ // DW_CFA_def_cfa_register 5(ebp)
++ 0x0d, 0x05,
++ };
++#elif defined(_TARGET_AMD64_)
++ const unsigned int code_alignment_factor = 1;
++ const int data_alignment_factor = -8;
++
++ UINT8 cieCode[] = {
++ // DW_CFA_def_cfa 7(rsp), 8
++ 0x0c, 0x07, 0x08,
++ // DW_CFA_offset 16, -16 (= -8 * 2)
++ (0x02 << 6) | 0x10, 0x01,
++ };
++
++ UINT8 fdeCode[] = {
++ // DW_CFA_advance_loc(1)
++ 0x02, 0x01,
++ // DW_CFA_def_cfa_offset(16)
++ 0x0e, 0x10,
++ // DW_CFA_offset 6, -16 (= -8 * 2)
++ (0x02 << 6) | 0x06, 0x02,
++ // DW_CFA_def_cfa_register(6)
++ 0x0d, 0x06,
++ };
++#else
++#error "Unsupported architecture"
++#endif
++
++ elfBuilder.OpenSection(".debug_frame", SHT_PROGBITS, 0);
++
++ //
++ // Common Information Entry
++ //
++ int cieLen = ALIGN_UP(sizeof(CIE) + sizeof(cieCode), ADDRESS_SIZE) + sizeof(Length);
++
++ CIE *pCIE = elfBuilder.ReserveT<CIE>(cieLen);
++
++ memset(pCIE, 0, cieLen);
++
++ pCIE->length = cieLen - sizeof(Length);
++ pCIE->id = 0xffffffff;
++ pCIE->version = 3;
++ pCIE->augmentation = 0;
++ Leb128Encode(code_alignment_factor, reinterpret_cast<char *>(&pCIE->code_alignment_factor), 1);
++ Leb128Encode(data_alignment_factor, reinterpret_cast<char *>(&pCIE->data_alignment_factor), 1);
++
++ pCIE->return_address_register = 0;
++
++ memcpy(&pCIE->instructions, cieCode, sizeof(cieCode));
++
++ //
++ // Frame Description Entry
++ //
++ int fdeLen = ALIGN_UP((sizeof(FDE) + sizeof(fdeCode)), ADDRESS_SIZE) + sizeof(Length);
++
++ FDE *pFDE = elfBuilder.ReserveT<FDE>(fdeLen);
++
++ memset(pFDE, 0, fdeLen);
++
++ pFDE->length = fdeLen - sizeof(Length);
++ pFDE->cie = 0;
++ pFDE->initial_location = pCode;
++ pFDE->address_range = codeSize;
++ memcpy(&pFDE->instructions, fdeCode, sizeof(fdeCode));
++
++ elfBuilder.CloseSection();
++}
++#endif // FEATURE_GDBJIT_FRAME
++
+ /* Create ELF/DWARF debug info for jitted method */
+ void NotifyGdb::MethodCompiled(MethodDesc* methodDescPtr)
+ {
+@@ -1765,19 +2378,21 @@ void NotifyGdb::MethodCompiled(MethodDesc* methodDescPtr)
+
+ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ {
+- int symbolCount = 0;
+- NewArrayHolder<Elf_Symbol> symbolNames;
+-
+ PCODE pCode = methodDescPtr->GetNativeCode();
++
+ if (pCode == NULL)
++ {
+ return;
+- unsigned int symInfoLen = 0;
+- NewArrayHolder<SymbolsInfo> symInfo = nullptr;
+- LocalsInfo locals;
++ }
+
+ /* Get method name & size of jitted code */
+- LPCUTF8 methodName = methodDescPtr->GetName();
+ EECodeInfo codeInfo(pCode);
++
++ if (!codeInfo.IsValid())
++ {
++ return;
++ }
++
+ TADDR codeSize = codeInfo.GetCodeManager()->GetFunctionSize(codeInfo.GetGCInfoToken());
+
+ pCode = PCODEToPINSTR(pCode);
+@@ -1800,59 +2415,76 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ if (length == 0)
+ return;
+
+- static NewArrayHolder<WCHAR> wszModuleNames = nullptr;
+- DWORD cCharsNeeded = 0;
++ bool bNotify = false;
+
+- // Get names of interesting modules from environment
+- if (wszModuleNames == nullptr)
++ Elf_Builder elfBuilder;
++
++ elfBuilder.Initialize(pCode, codeSize);
++
++#ifdef FEATURE_GDBJIT_FRAME
+ {
+- cCharsNeeded = GetEnvironmentVariableW(W("CORECLR_GDBJIT"), NULL, 0);
++ bool bEmitted = EmitFrameInfo(elfBuilder, pCode, codeSize);
++ bNotify = bNotify || bEmitted;
++ }
++#endif
+
+- if(cCharsNeeded == 0)
+- return;
+- wszModuleNames = new WCHAR[cCharsNeeded+1];
+- cCharsNeeded = GetEnvironmentVariableW(W("CORECLR_GDBJIT"), wszModuleNames, cCharsNeeded);
+- if(cCharsNeeded == 0)
+- return;
++ if (isListedModule(wszModuleFile))
++ {
++ bool bEmitted = EmitDebugInfo(elfBuilder, methodDescPtr, pCode, codeSize, szModuleFile);
++ bNotify = bNotify || bEmitted;
+ }
+- else
++
++ if (!bNotify)
+ {
+- cCharsNeeded = wcslen(wszModuleNames);
++ return;
+ }
+
+- BOOL isUserDebug = FALSE;
++ elfBuilder.Finalize();
+
+- NewArrayHolder<WCHAR> wszModuleName = new WCHAR[cCharsNeeded+1];
+- LPWSTR pComma = wcsstr(wszModuleNames, W(","));
+- LPWSTR tmp = wszModuleNames;
++ /* Create GDB JIT structures */
++ NewHolder<jit_code_entry> jit_symbols = new jit_code_entry;
+
+- while (pComma != NULL)
+- {
+- wcsncpy(wszModuleName, tmp, pComma - tmp);
+- wszModuleName[pComma - tmp] = W('\0');
++ /* Fill the new entry */
++ jit_symbols->next_entry = jit_symbols->prev_entry = 0;
++ jit_symbols->symfile_addr = elfBuilder.Export(&jit_symbols->symfile_size);
+
+- if (wcscmp(wszModuleName, wszModuleFile) == 0)
+- {
+- isUserDebug = TRUE;
+- break;
+- }
+- tmp = pComma + 1;
+- pComma = wcsstr(tmp, W(","));
+- }
+- if (isUserDebug == FALSE)
++ /* Link into list */
++ jit_code_entry *head = __jit_debug_descriptor.first_entry;
++ __jit_debug_descriptor.first_entry = jit_symbols;
++ if (head != 0)
+ {
+- wcsncpy(wszModuleName, tmp, wcslen(tmp));
+- wszModuleName[wcslen(tmp)] = W('\0');
+- if (wcscmp(wszModuleName, wszModuleFile) == 0)
+- {
+- isUserDebug = TRUE;
+- }
++ jit_symbols->next_entry = head;
++ head->prev_entry = jit_symbols;
+ }
+
+- if (isUserDebug == FALSE)
+- {
+- return;
+- }
++ jit_symbols.SuppressRelease();
++
++ /* Notify the debugger */
++ __jit_debug_descriptor.relevant_entry = jit_symbols;
++ __jit_debug_descriptor.action_flag = JIT_REGISTER_FN;
++ __jit_debug_register_code();
++}
++
++#ifdef FEATURE_GDBJIT_FRAME
++bool NotifyGdb::EmitFrameInfo(Elf_Builder &elfBuilder, PCODE pCode, TADDR codeSize)
++{
++ BuildDebugFrame(elfBuilder, pCode, codeSize);
++ return true;
++}
++#endif // FEATURE_GDBJIT_FRAME
++
++bool NotifyGdb::EmitDebugInfo(Elf_Builder &elfBuilder, MethodDesc* methodDescPtr, PCODE pCode, TADDR codeSize, const char *szModuleFile)
++{
++ unsigned int thunkIndexBase = elfBuilder.GetSectionCount();
++
++ LPCUTF8 methodName = methodDescPtr->GetName();
++
++ int symbolCount = 0;
++ NewArrayHolder<Elf_Symbol> symbolNames;
++
++ unsigned int symInfoLen = 0;
++ NewArrayHolder<SymbolsInfo> symInfo = nullptr;
++ LocalsInfo locals;
+
+ NewHolder<TK_TypeInfoMap> pTypeMap = new TK_TypeInfoMap();
+
+@@ -1860,7 +2492,7 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ HRESULT hr = GetDebugInfoFromPDB(methodDescPtr, symInfo, symInfoLen, locals);
+ if (FAILED(hr) || symInfoLen == 0)
+ {
+- return;
++ return false;
+ }
+
+ int method_count = countFuncs(symInfo, symInfoLen);
+@@ -1871,7 +2503,7 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ /* Collect addresses of thunks called by method */
+ if (!CollectCalledMethods(pCalledMethods, (TADDR)methodDescPtr->GetNativeCode(), method, symbolNames, symbolCount))
+ {
+- return;
++ return false;
+ }
+ pCH->SetCalledMethods(NULL);
+
+@@ -1887,7 +2519,7 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+
+ if (firstLineIndex >= symInfoLen)
+ {
+- return;
++ return false;
+ }
+
+ int start_index = getNextPrologueIndex(0, symInfo, symInfoLen);
+@@ -1921,19 +2553,19 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ start_index = end_index;
+ }
+
+- MemBuf elfHeader, sectHeaders, sectStr, sectSymTab, sectStrTab, dbgInfo, dbgAbbrev, dbgPubname, dbgPubType, dbgLine,
+- dbgStr, elfFile;
++ MemBuf sectSymTab, sectStrTab, dbgInfo, dbgAbbrev, dbgPubname, dbgPubType, dbgLine,
++ dbgStr;
+
+ /* Build .debug_abbrev section */
+ if (!BuildDebugAbbrev(dbgAbbrev))
+ {
+- return;
++ return false;
+ }
+
+ /* Build .debug_line section */
+ if (!BuildLineTable(dbgLine, pCode, codeSize, symInfo, symInfoLen))
+ {
+- return;
++ return false;
+ }
+
+ DebugStrings[1] = szModuleFile;
+@@ -1941,13 +2573,13 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ /* Build .debug_str section */
+ if (!BuildDebugStrings(dbgStr, pTypeMap, method))
+ {
+- return;
++ return false;
+ }
+
+ /* Build .debug_info section */
+ if (!BuildDebugInfo(dbgInfo, pTypeMap, method))
+ {
+- return;
++ return false;
+ }
+
+ for (int i = 0; i < method.GetCount(); ++i)
+@@ -1959,13 +2591,13 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ /* Build .debug_pubname section */
+ if (!BuildDebugPub(dbgPubname, methodName, dbgInfo.MemSize, 0x28))
+ {
+- return;
++ return false;
+ }
+
+ /* Build debug_pubtype section */
+ if (!BuildDebugPub(dbgPubType, "int", dbgInfo.MemSize, 0x1a))
+ {
+- return;
++ return false;
+ }
+
+ /* Build .strtab section */
+@@ -1979,158 +2611,64 @@ void NotifyGdb::OnMethodCompiled(MethodDesc* methodDescPtr)
+ }
+ if (!BuildStringTableSection(sectStrTab, symbolNames, symbolCount))
+ {
+- return;
++ return false;
+ }
+ /* Build .symtab section */
+- if (!BuildSymbolTableSection(sectSymTab, pCode, codeSize, method, symbolNames, symbolCount))
++ if (!BuildSymbolTableSection(sectSymTab, pCode, codeSize, method, symbolNames, symbolCount, thunkIndexBase))
+ {
+- return;
++ return false;
+ }
+
+- /* Build section headers table and section names table */
+- BuildSectionTables(sectHeaders, sectStr, method, symbolCount);
+-
+- /* Patch section offsets & sizes */
+- long offset = sizeof(Elf_Ehdr);
+- Elf_Shdr* pShdr = reinterpret_cast<Elf_Shdr*>(sectHeaders.MemPtr.GetValue());
+- ++pShdr; // .text
+- pShdr->sh_addr = pCode;
+- pShdr->sh_size = codeSize;
+- ++pShdr; // .shstrtab
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = sectStr.MemSize;
+- offset += sectStr.MemSize;
+- ++pShdr; // .debug_str
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = dbgStr.MemSize;
+- offset += dbgStr.MemSize;
+- ++pShdr; // .debug_abbrev
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = dbgAbbrev.MemSize;
+- offset += dbgAbbrev.MemSize;
+- ++pShdr; // .debug_info
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = dbgInfo.MemSize;
+- offset += dbgInfo.MemSize;
+- ++pShdr; // .debug_pubnames
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = dbgPubname.MemSize;
+- offset += dbgPubname.MemSize;
+- ++pShdr; // .debug_pubtypes
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = dbgPubType.MemSize;
+- offset += dbgPubType.MemSize;
+- ++pShdr; // .debug_line
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = dbgLine.MemSize;
+- offset += dbgLine.MemSize;
+- ++pShdr; // .symtab
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = sectSymTab.MemSize;
+- pShdr->sh_link = GetSectionIndex(".strtab");
+- offset += sectSymTab.MemSize;
+- ++pShdr; // .strtab
+- pShdr->sh_offset = offset;
+- pShdr->sh_size = sectStrTab.MemSize;
+- offset += sectStrTab.MemSize;
+-
+- // .thunks
+ for (int i = 1 + method.GetCount(); i < symbolCount; i++)
+ {
+- ++pShdr;
+- pShdr->sh_addr = PCODEToPINSTR(symbolNames[i].m_value);
+- pShdr->sh_size = 8;
+- }
++ char name[256];
+
+- /* Build ELF header */
+- if (!BuildELFHeader(elfHeader))
+- {
+- return;
++ sprintf_s(name, _countof(name), ".thunk_%i", i);
++
++ Elf_SectionTracker *thunk = elfBuilder.OpenSection(name, SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);
++ thunk->DisableHeaderUpdate();
++ elfBuilder.CloseSection();
+ }
+- Elf_Ehdr* header = reinterpret_cast<Elf_Ehdr*>(elfHeader.MemPtr.GetValue());
+-#ifdef _TARGET_ARM_
+- header->e_flags = EF_ARM_EABI_VER5;
+-#ifdef ARM_SOFTFP
+- header->e_flags |= EF_ARM_SOFT_FLOAT;
+-#else
+- header->e_flags |= EF_ARM_VFP_FLOAT;
+-#endif
+-#endif
+- header->e_shoff = offset;
+- header->e_shentsize = sizeof(Elf_Shdr);
+- int thunks_count = symbolCount - method.GetCount() - 1;
+- header->e_shnum = SectionNamesCount + thunks_count;
+- header->e_shstrndx = GetSectionIndex(".shstrtab");
+-
+- /* Build ELF image in memory */
+- elfFile.MemSize = elfHeader.MemSize + sectStr.MemSize + dbgStr.MemSize + dbgAbbrev.MemSize + dbgInfo.MemSize +
+- dbgPubname.MemSize + dbgPubType.MemSize + dbgLine.MemSize + sectSymTab.MemSize +
+- sectStrTab.MemSize + sectHeaders.MemSize;
+- elfFile.MemPtr = new char[elfFile.MemSize];
+-
+- /* Copy section data */
+- offset = 0;
+- memcpy(elfFile.MemPtr, elfHeader.MemPtr, elfHeader.MemSize);
+- offset += elfHeader.MemSize;
+- memcpy(elfFile.MemPtr + offset, sectStr.MemPtr, sectStr.MemSize);
+- offset += sectStr.MemSize;
+- memcpy(elfFile.MemPtr + offset, dbgStr.MemPtr, dbgStr.MemSize);
+- offset += dbgStr.MemSize;
+- memcpy(elfFile.MemPtr + offset, dbgAbbrev.MemPtr, dbgAbbrev.MemSize);
+- offset += dbgAbbrev.MemSize;
+- memcpy(elfFile.MemPtr + offset, dbgInfo.MemPtr, dbgInfo.MemSize);
+- offset += dbgInfo.MemSize;
+- memcpy(elfFile.MemPtr + offset, dbgPubname.MemPtr, dbgPubname.MemSize);
+- offset += dbgPubname.MemSize;
+- memcpy(elfFile.MemPtr + offset, dbgPubType.MemPtr, dbgPubType.MemSize);
+- offset += dbgPubType.MemSize;
+- memcpy(elfFile.MemPtr + offset, dbgLine.MemPtr, dbgLine.MemSize);
+- offset += dbgLine.MemSize;
+- memcpy(elfFile.MemPtr + offset, sectSymTab.MemPtr, sectSymTab.MemSize);
+- offset += sectSymTab.MemSize;
+- memcpy(elfFile.MemPtr + offset, sectStrTab.MemPtr, sectStrTab.MemSize);
+- offset += sectStrTab.MemSize;
+-
+- memcpy(elfFile.MemPtr + offset, sectHeaders.MemPtr, sectHeaders.MemSize);
+-
+- elfFile.MemPtr.SuppressRelease();
+-
+-#ifdef GDBJIT_DUMPELF
+- DumpElf(methodName, elfFile);
+-#endif
+
+- /* Create GDB JIT structures */
+- NewHolder<jit_code_entry> jit_symbols = new jit_code_entry;
++ elfBuilder.OpenSection(".debug_str", SHT_PROGBITS, SHF_MERGE | SHF_STRINGS);
++ elfBuilder.Append(dbgStr.MemPtr, dbgStr.MemSize);
++ elfBuilder.CloseSection();
+
+- /* Fill the new entry */
+- jit_symbols->next_entry = jit_symbols->prev_entry = 0;
+- jit_symbols->symfile_addr = elfFile.MemPtr;
+- jit_symbols->symfile_size = elfFile.MemSize;
+-
+- /* Link into list */
+- jit_code_entry *head = __jit_debug_descriptor.first_entry;
+- __jit_debug_descriptor.first_entry = jit_symbols;
+- if (head != 0)
+- {
+- jit_symbols->next_entry = head;
+- head->prev_entry = jit_symbols;
+- }
+-
+- jit_symbols.SuppressRelease();
++ elfBuilder.OpenSection(".debug_abbrev", SHT_PROGBITS, 0);
++ elfBuilder.Append(dbgAbbrev.MemPtr, dbgAbbrev.MemSize);
++ elfBuilder.CloseSection();
+
+- /* Notify the debugger */
+- __jit_debug_descriptor.relevant_entry = jit_symbols;
+- __jit_debug_descriptor.action_flag = JIT_REGISTER_FN;
+- __jit_debug_register_code();
++ elfBuilder.OpenSection(".debug_info", SHT_PROGBITS, 0);
++ elfBuilder.Append(dbgInfo.MemPtr, dbgInfo.MemSize);
++ elfBuilder.CloseSection();
++
++ elfBuilder.OpenSection(".debug_pubnames", SHT_PROGBITS, 0);
++ elfBuilder.Append(dbgPubname.MemPtr, dbgPubname.MemSize);
++ elfBuilder.CloseSection();
++
++ elfBuilder.OpenSection(".debug_pubtypes", SHT_PROGBITS, 0);
++ elfBuilder.Append(dbgPubType.MemPtr, dbgPubType.MemSize);
++ elfBuilder.CloseSection();
++
++ elfBuilder.OpenSection(".debug_line", SHT_PROGBITS, 0);
++ elfBuilder.Append(dbgLine.MemPtr, dbgLine.MemSize);
++ elfBuilder.CloseSection();
++
++ Elf_SectionTracker *strtab = elfBuilder.OpenSection(".strtab", SHT_STRTAB, 0);
++ elfBuilder.Append(sectStrTab.MemPtr, sectStrTab.MemSize);
++ elfBuilder.CloseSection();
++
++ Elf_SectionTracker *symtab = elfBuilder.OpenSection(".symtab", SHT_SYMTAB, 0);
++ elfBuilder.Append(sectSymTab.MemPtr, sectSymTab.MemSize);
++ symtab->Header()->sh_link = strtab->GetIndex();
++ symtab->Header()->sh_entsize = sizeof(Elf_Sym);
++ elfBuilder.CloseSection();
++
++ return true;
+ }
+
+ void NotifyGdb::MethodDropped(MethodDesc* methodDescPtr)
+ {
+- static const int textSectionIndex = GetSectionIndex(".text");
+-
+- if (textSectionIndex < 0)
+- return;
+-
+ PCODE pCode = methodDescPtr->GetNativeCode();
+
+ if (pCode == NULL)
+@@ -2144,7 +2682,7 @@ void NotifyGdb::MethodDropped(MethodDesc* methodDescPtr)
+
+ const Elf_Ehdr* pEhdr = reinterpret_cast<const Elf_Ehdr*>(ptr);
+ const Elf_Shdr* pShdr = reinterpret_cast<const Elf_Shdr*>(ptr + pEhdr->e_shoff);
+- pShdr += textSectionIndex; // bump to .text section
++ pShdr += ELF_BUILDER_TEXT_SECTION_INDEX; // bump to .text section
+ if (pShdr->sh_addr == pCode)
+ {
+ /* Notify the debugger */
+@@ -2637,10 +3175,9 @@ bool NotifyGdb::BuildStringTableSection(MemBuf& buf, NewArrayHolder<Elf_Symbol>
+
+ /* Build ELF .symtab section */
+ bool NotifyGdb::BuildSymbolTableSection(MemBuf& buf, PCODE addr, TADDR codeSize, FunctionMemberPtrArrayHolder &method,
+- NewArrayHolder<Elf_Symbol> &symbolNames, int symbolCount)
++ NewArrayHolder<Elf_Symbol> &symbolNames, int symbolCount,
++ unsigned int thunkIndexBase)
+ {
+- static const int textSectionIndex = GetSectionIndex(".text");
+-
+ buf.MemSize = symbolCount * sizeof(Elf_Sym);
+ buf.MemPtr = new char[buf.MemSize];
+
+@@ -2659,7 +3196,7 @@ bool NotifyGdb::BuildSymbolTableSection(MemBuf& buf, PCODE addr, TADDR codeSize,
+ sym[i].setBindingAndType(STB_GLOBAL, STT_FUNC);
+ sym[i].st_other = 0;
+ sym[i].st_value = PINSTRToPCODE(symbolNames[i].m_value - addr);
+- sym[i].st_shndx = textSectionIndex;
++ sym[i].st_shndx = ELF_BUILDER_TEXT_SECTION_INDEX;
+ sym[i].st_size = symbolNames[i].m_size;
+ }
+
+@@ -2668,7 +3205,7 @@ bool NotifyGdb::BuildSymbolTableSection(MemBuf& buf, PCODE addr, TADDR codeSize,
+ sym[i].st_name = symbolNames[i].m_off;
+ sym[i].setBindingAndType(STB_GLOBAL, STT_FUNC);
+ sym[i].st_other = 0;
+- sym[i].st_shndx = SectionNamesCount + (i - (1 + method.GetCount())); // .thunks section index
++ sym[i].st_shndx = thunkIndexBase + (i - (1 + method.GetCount())); // .thunks section index
+ sym[i].st_size = 8;
+ #ifdef _TARGET_ARM_
+ sym[i].st_value = 1; // for THUMB code
+@@ -2679,97 +3216,6 @@ bool NotifyGdb::BuildSymbolTableSection(MemBuf& buf, PCODE addr, TADDR codeSize,
+ return true;
+ }
+
+-int NotifyGdb::GetSectionIndex(const char *sectName)
+-{
+- for (int i = 0; i < SectionNamesCount; ++i)
+- if (strcmp(SectionNames[i], sectName) == 0)
+- return i;
+- return -1;
+-}
+-
+-/* Build the ELF section headers table and section names table */
+-void NotifyGdb::BuildSectionTables(MemBuf& sectBuf, MemBuf& strBuf, FunctionMemberPtrArrayHolder &method,
+- int symbolCount)
+-{
+- static const int symtabSectionIndex = GetSectionIndex(".symtab");
+- static const int nullSectionIndex = GetSectionIndex("");
+-
+- const int thunks_count = symbolCount - 1 - method.GetCount();
+-
+- // Approximate length of single section name.
+- // Used only to reduce memory reallocations.
+- static const int SECT_NAME_LENGTH = 11;
+-
+- strBuf.Resize(SECT_NAME_LENGTH * (SectionNamesCount + thunks_count));
+-
+- Elf_Shdr* sectionHeaders = new Elf_Shdr[SectionNamesCount + thunks_count];
+- sectBuf.MemPtr = reinterpret_cast<char*>(sectionHeaders);
+- sectBuf.MemSize = sizeof(Elf_Shdr) * (SectionNamesCount + thunks_count);
+-
+- Elf_Shdr* pSh = sectionHeaders;
+- uint32_t sectNameOffset = 0;
+-
+- // Additional memory for remaining section names,
+- // grows twice on each reallocation.
+- int addSize = SECT_NAME_LENGTH;
+-
+- // Fill section headers and names
+- for (int i = 0; i < SectionNamesCount + thunks_count; ++i, ++pSh)
+- {
+- char thunkSectNameBuf[256]; // temporary buffer for .thunk_# section name
+- const char *sectName;
+-
+- bool isThunkSection = i >= SectionNamesCount;
+- if (isThunkSection)
+- {
+- sprintf_s(thunkSectNameBuf, _countof(thunkSectNameBuf), ".thunk_%i", i);
+- sectName = thunkSectNameBuf;
+- }
+- else
+- {
+- sectName = SectionNames[i];
+- }
+-
+- // Ensure that there is enough memory for section name,
+- // reallocate if necessary.
+- pSh->sh_name = sectNameOffset;
+- sectNameOffset += strlen(sectName) + 1;
+- if (sectNameOffset > strBuf.MemSize)
+- {
+- // Allocate more memory for remaining section names
+- strBuf.Resize(sectNameOffset + addSize);
+- addSize *= 2;
+- }
+-
+- strcpy(strBuf.MemPtr + pSh->sh_name, sectName);
+-
+- // All .thunk_* sections have the same type and flags
+- int index = isThunkSection ? SectionNamesCount : i;
+- pSh->sh_type = Sections[index].m_type;
+- pSh->sh_flags = Sections[index].m_flags;
+-
+- pSh->sh_addr = 0;
+- pSh->sh_offset = 0;
+- pSh->sh_size = 0;
+- pSh->sh_link = SHN_UNDEF;
+- pSh->sh_info = 0;
+- pSh->sh_addralign = i == nullSectionIndex ? 0 : 1;
+- pSh->sh_entsize = i == symtabSectionIndex ? sizeof(Elf_Sym) : 0;
+- }
+-
+- // Set actual used size to avoid garbage in ELF section
+- strBuf.MemSize = sectNameOffset;
+-}
+-
+-/* Build the ELF header */
+-bool NotifyGdb::BuildELFHeader(MemBuf& buf)
+-{
+- Elf_Ehdr* header = new Elf_Ehdr;
+- buf.MemPtr = reinterpret_cast<char*>(header);
+- buf.MemSize = sizeof(Elf_Ehdr);
+- return true;
+-}
+-
+ /* Split full path name into directory & file names */
+ void NotifyGdb::SplitPathname(const char* path, const char*& pathName, const char*& fileName)
+ {
+diff --git a/src/vm/gdbjit.h b/src/vm/gdbjit.h
+index 84b9109..ebd5a7a 100644
+--- a/src/vm/gdbjit.h
++++ b/src/vm/gdbjit.h
+@@ -324,6 +324,7 @@ public:
+ };
+
+ struct Elf_Symbol;
++class Elf_Builder;
+
+ class NotifyGdb
+ {
+@@ -404,12 +405,14 @@ private:
+
+ static void OnMethodCompiled(MethodDesc* methodDescPtr);
+
+- static int GetSectionIndex(const char *sectName);
+- static bool BuildELFHeader(MemBuf& buf);
+- static void BuildSectionTables(MemBuf& sectBuf, MemBuf& strBuf, FunctionMemberPtrArrayHolder &method,
+- int symbolCount);
++#ifdef FEATURE_GDBJIT_FRAME
++ static bool EmitFrameInfo(Elf_Builder &, PCODE pCode, TADDR codeSzie);
++#endif // FEATURE_GDBJIT_FRAME
++ static bool EmitDebugInfo(Elf_Builder &, MethodDesc* methodDescPtr, PCODE pCode, TADDR codeSize, const char *szModuleFile);
++
+ static bool BuildSymbolTableSection(MemBuf& buf, PCODE addr, TADDR codeSize, FunctionMemberPtrArrayHolder &method,
+- NewArrayHolder<Elf_Symbol> &symbolNames, int symbolCount);
++ NewArrayHolder<Elf_Symbol> &symbolNames, int symbolCount,
++ unsigned int thunkIndexBase);
+ static bool BuildStringTableSection(MemBuf& strTab, NewArrayHolder<Elf_Symbol> &symbolNames, int symbolCount);
+ static bool BuildDebugStrings(MemBuf& buf, PTK_TypeInfoMap pTypeMap, FunctionMemberPtrArrayHolder &method);
+ static bool BuildDebugAbbrev(MemBuf& buf);
+diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp
+index fccec51..88bd9de 100644
+--- a/src/vm/prestub.cpp
++++ b/src/vm/prestub.cpp
+@@ -52,7 +52,12 @@
+ #include "callcounter.h"
+ #endif
+
+-#ifndef DACCESS_COMPILE
++#if defined(FEATURE_GDBJIT)
++#include "gdbjit.h"
++__declspec(thread) bool tls_isSymReaderInProgress = false;
++#endif
++
++#ifndef DACCESS_COMPILE
+
+ EXTERN_C void STDCALL ThePreStub();
+
+@@ -231,17 +236,13 @@ void DACNotifyCompilationFinished(MethodDesc *methodDesc)
+
+ _ASSERTE(modulePtr);
+
+-#ifndef FEATURE_GDBJIT
+ // Are we listed?
+ USHORT jnt = jn.Requested((TADDR) modulePtr, t);
+ if (jnt & CLRDATA_METHNOTIFY_GENERATED)
+ {
+ // If so, throw an exception!
+-#endif
+ DACNotify::DoJITNotification(methodDesc);
+-#ifndef FEATURE_GDBJIT
+ }
+-#endif
+ }
+ }
+
+@@ -678,6 +679,15 @@ Done:
+ LOG((LF_CORDB, LL_EVERYTHING, "MethodDesc::MakeJitWorker finished. Stub is" FMT_ADDR "\n",
+ DBG_ADDR(pCode)));
+
++#if defined(FEATURE_GDBJIT) && defined(FEATURE_PAL) && !defined(CROSSGEN_COMPILE)
++ if (!tls_isSymReaderInProgress)
++ {
++ tls_isSymReaderInProgress = true;
++ NotifyGdb::MethodCompiled(this);
++ tls_isSymReaderInProgress = false;
++ }
++#endif
++
+ return pCode;
+ }
+
+@@ -1568,6 +1578,15 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT)
+ }
+ #endif // FEATURE_INTERPRETER
+ } // end if (pCode == NULL)
++#if defined(FEATURE_GDBJIT) && defined(FEATURE_PAL) && !defined(CROSSGEN_COMPILE)
++ else if (!tls_isSymReaderInProgress)
++ {
++ tls_isSymReaderInProgress = true;
++ NotifyGdb::MethodCompiled(this);
++ tls_isSymReaderInProgress = false;
++ }
++#endif
++
+ } // end else if (IsIL() || IsNoMetadata())
+ else if (IsNDirect())
+ {
+diff --git a/src/vm/util.cpp b/src/vm/util.cpp
+index da7d18c..9d9800b 100644
+--- a/src/vm/util.cpp
++++ b/src/vm/util.cpp
+@@ -3315,7 +3315,6 @@ void InitializeClrNotifications()
+
+ #if defined(FEATURE_GDBJIT)
+ #include "gdbjit.h"
+-__declspec(thread) bool tls_isSymReaderInProgress = false;
+ #endif // FEATURE_GDBJIT
+
+ // called from the runtime
+@@ -3329,14 +3328,7 @@ void DACNotify::DoJITNotification(MethodDesc *MethodDescPtr)
+ MODE_PREEMPTIVE;
+ }
+ CONTRACTL_END;
+-#if defined(FEATURE_GDBJIT) && defined(FEATURE_PAL) && !defined(CROSSGEN_COMPILE)
+- if(!tls_isSymReaderInProgress)
+- {
+- tls_isSymReaderInProgress = true;
+- NotifyGdb::MethodCompiled(MethodDescPtr);
+- tls_isSymReaderInProgress = false;
+- }
+-#endif
++
+ TADDR Args[2] = { JIT_NOTIFICATION, (TADDR) MethodDescPtr };
+ DACNotifyExceptionHelper(Args, 2);
+ }
+--
+1.9.1
+
diff --git a/packaging/0019-Add-profiling-support.patch b/packaging/0019-Add-profiling-support.patch
new file mode 100644
index 0000000000..1e39d21a8e
--- /dev/null
+++ b/packaging/0019-Add-profiling-support.patch
@@ -0,0 +1,773 @@
+From eef4ae4f508fa9d1f4acb3ee533a3b8a756693e1 Mon Sep 17 00:00:00 2001
+From: CHUNSEOK LEE <chunseok.lee@samsung.com>
+Date: Fri, 18 Aug 2017 14:05:03 +0900
+Subject: [PATCH 19/23] Add profiling support
+
+Signed-off-by: CHUNSEOK LEE <chunseok.lee@samsung.com>
+---
+ Documentation/botr/clr-abi.md | 36 +++++-
+ clrfeatures.cmake | 2 +-
+ src/jit/codegencommon.cpp | 113 ++++++++++++++++-
+ src/jit/codegenxarch.cpp | 38 +++++-
+ src/jit/compiler.cpp | 23 ++++
+ src/jit/compiler.h | 8 ++
+ src/jit/lclvars.cpp | 2 +-
+ src/jit/target.h | 9 +-
+ src/vm/CMakeLists.txt | 1 +
+ src/vm/amd64/asmhelpers.S | 289 ++++++++++++++++++++++++++++++++++++++++++
+ src/vm/amd64/profiler.cpp | 12 ++
+ src/vm/amd64/unixstubs.cpp | 15 ---
+ 12 files changed, 523 insertions(+), 25 deletions(-)
+ create mode 100644 src/vm/amd64/asmhelpers.S
+
+diff --git a/Documentation/botr/clr-abi.md b/Documentation/botr/clr-abi.md
+index a85bfa4..c0ec331 100644
+--- a/Documentation/botr/clr-abi.md
++++ b/Documentation/botr/clr-abi.md
+@@ -585,9 +585,9 @@ The CLR unwinder assumes any non-leaf frame was unwound as a result of a call. T
+
+ If the JIT gets passed `CORJIT_FLG_PROF_ENTERLEAVE`, then the JIT might need to insert native entry/exit/tail call probes. To determine for sure, the JIT must call GetProfilingHandle. This API returns as out parameters, the true dynamic boolean indicating if the JIT should actually insert the probes and a parameter to pass to the callbacks (typed as void*), with an optional indirection (used for NGEN). This parameter is always the first argument to all of the call-outs (thus placed in the usual first argument register `RCX` (AMD64) or `R0` (ARM, ARM64)).
+
+-Outside of the prolog (in a GC interruptible location), the JIT injects a call to `CORINFO_HELP_PROF_FCN_ENTER`. For AMD64, all argument registers will be homed into their caller-allocated stack locations (similar to varargs). For ARM and ARM64, all arguments are prespilled (again similar to varargs).
++Outside of the prolog (in a GC interruptible location), the JIT injects a call to `CORINFO_HELP_PROF_FCN_ENTER`. For AMD64, on Windows all argument registers will be homed into their caller-allocated stack locations (similar to varargs), on Unix all argument registers will be stored in the inner structure. For ARM and ARM64, all arguments are prespilled (again similar to varargs).
+
+-After computing the return value and storing it in the correct register, but before any epilog code (including before a possible GS cookie check), the JIT injects a call to `CORINFO_HELP_PROF_FCN_LEAVE`. For AMD64 this call must preserve the return register: `RAX` or `XMM0`. For ARM, the return value will be moved from `R0` to `R2` (if it was in `R0`), `R1`, `R2`, and `S0/D0` must be preserved by the callee (longs will be `R2`, `R1` - note the unusual ordering of the registers, floats in `S0`, doubles in `D0`, smaller integrals in `R2`).
++After computing the return value and storing it in the correct register, but before any epilog code (including before a possible GS cookie check), the JIT injects a call to `CORINFO_HELP_PROF_FCN_LEAVE`. For AMD64 this call must preserve the return register: `RAX` or `XMM0` on Windows and `RAX` and `RDX` or `XMM0` and `XMM1` on Unix. For ARM, the return value will be moved from `R0` to `R2` (if it was in `R0`), `R1`, `R2`, and `S0/D0` must be preserved by the callee (longs will be `R2`, `R1` - note the unusual ordering of the registers, floats in `S0`, doubles in `D0`, smaller integrals in `R2`).
+
+ TODO: describe ARM64 profile leave conventions.
+
+@@ -667,3 +667,35 @@ The general rules outlined in the System V x86_64 ABI (described at http://www.x
+ 3. The JIT proactively generates frame register frames (with `RBP` as a frame register) in order to aid the native OS tooling for stack unwinding and the like.
+ 4. All the other internal VM contracts for PInvoke, EH, and generic support remains in place. Please see the relevant sections above for more details. Note, however, that the registers used are different on System V due to the different calling convention. For example, the integer argument registers are, in order, RDI, RSI, RDX, RCX, R8, and R9. Thus, where the first argument (typically, the "this" pointer) on Windows AMD64 goes in RCX, on System V it goes in RDI, and so forth.
+ 5. Structs with explicit layout are always passed by value on the stack.
++6. The following table describes register usage according to the System V x86_64 ABI
++
++```
++| Register | Usage | Preserved across |
++| | | function calls |
++|--------------|-----------------------------------------|-------------------|
++| %rax | temporary register; with variable argu- | No |
++| | ments passes information about the | |
++| | number of SSE registers used; | |
++| | 1st return argument | |
++| %rbx | callee-saved register; optionally used | Yes |
++| | as base pointer | |
++| %rcx | used to pass 4st integer argument to | No |
++| | to functions | |
++| %rdx | used to pass 3rd argument to functions | No |
++| | 2nd return register | |
++| %rsp | stack pointer | Yes |
++| %rbp | callee-saved register; optionally used | Yes |
++| | as frame pointer | |
++| %rsi | used to pass 2nd argument to functions | No |
++| %rdi | used to pass 1st argument to functions | No |
++| %r8 | used to pass 5th argument to functions | No |
++| %r9 | used to pass 6th argument to functions | No |
++| %r10 | temporary register, used for passing a | No |
++| | function's static chain pointer | |
++| %r11 | temporary register | No |
++| %r12-%r15 | callee-saved registers | Yes |
++| %xmm0-%xmm1 | used to pass and return floating point | No |
++| | arguments | |
++| %xmm2-%xmm7 | used to pass floating point arguments | No |
++| %xmm8-%xmm15 | temporary registers | No |
++```
+diff --git a/clrfeatures.cmake b/clrfeatures.cmake
+index f047c91..0e2801c 100644
+--- a/clrfeatures.cmake
++++ b/clrfeatures.cmake
+@@ -1,5 +1,5 @@
+ if(CLR_CMAKE_TARGET_TIZEN_LINUX)
+- set(FEATURE_EVENT_TRACE 0)
++ set(FEATURE_EVENT_TRACE 1)
+ endif()
+
+ if(NOT DEFINED FEATURE_EVENT_TRACE)
+diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp
+index 719299e..50f43fa 100644
+--- a/src/jit/codegencommon.cpp
++++ b/src/jit/codegencommon.cpp
+@@ -4431,7 +4431,9 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere
+ if ((regSet.rsMaskPreSpillRegs(false) & genRegMask(regNum)) == 0)
+ #endif // _TARGET_ARM_
+ {
+- noway_assert(xtraReg != varDsc->lvArgReg + i);
++#if !defined(UNIX_AMD64_ABI)
++ noway_assert(xtraReg != (varDsc->lvArgReg + i));
++#endif
+ noway_assert(regArgMaskLive & genRegMask(regNum));
+ }
+
+@@ -7437,7 +7439,9 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
+ return;
+ }
+
+-#if defined(_TARGET_AMD64_) && !defined(UNIX_AMD64_ABI) // No profiling for System V systems yet.
++#if defined(_TARGET_AMD64_)
++#if !defined(UNIX_AMD64_ABI)
++
+ unsigned varNum;
+ LclVarDsc* varDsc;
+
+@@ -7566,6 +7570,57 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
+ *pInitRegZeroed = false;
+ }
+
++#else // !defined(UNIX_AMD64_ABI)
++
++ // Emit profiler EnterCallback(ProfilerMethHnd, caller's SP)
++ // R14 = ProfilerMethHnd
++ if (compiler->compProfilerMethHndIndirected)
++ {
++ // Profiler hooks enabled during Ngen time.
++ // Profiler handle needs to be accessed through an indirection of a pointer.
++ getEmitter()->emitIns_R_AI(INS_mov, EA_PTR_DSP_RELOC, REG_PROFILER_ENTER_ARG_0,
++ (ssize_t)compiler->compProfilerMethHnd);
++ }
++ else
++ {
++ // No need to record relocations, if we are generating ELT hooks under the influence
++ // of COMPlus_JitELTHookEnabled=1
++ if (compiler->opts.compJitELTHookEnabled)
++ {
++ genSetRegToIcon(REG_PROFILER_ENTER_ARG_0, (ssize_t)compiler->compProfilerMethHnd, TYP_I_IMPL);
++ }
++ else
++ {
++ instGen_Set_Reg_To_Imm(EA_8BYTE, REG_PROFILER_ENTER_ARG_0, (ssize_t)compiler->compProfilerMethHnd);
++ }
++ }
++
++ // R15 = caller's SP
++ // Notes
++ // 1) Here we can query caller's SP offset since prolog will be generated after final frame layout.
++ // 2) caller's SP relative offset to FramePointer will be negative. We need to add absolute value
++ // of that offset to FramePointer to obtain caller's SP value.
++ assert(compiler->lvaOutgoingArgSpaceVar != BAD_VAR_NUM);
++ int callerSPOffset = compiler->lvaToCallerSPRelativeOffset(0, isFramePointerUsed());
++ getEmitter()->emitIns_R_AR(INS_lea, EA_PTRSIZE, REG_PROFILER_ENTER_ARG_1, genFramePointerReg(), -callerSPOffset);
++
++ // Can't have a call until we have enough padding for rejit
++ genPrologPadForReJit();
++
++ // We can use any callee trash register (other than RAX, RDI, RSI) for call target.
++ // We use R11 here. This will emit either
++ // "call ip-relative 32-bit offset" or
++ // "mov r11, helper addr; call r11"
++ genEmitHelperCall(CORINFO_HELP_PROF_FCN_ENTER, 0, EA_UNKNOWN, REG_DEFAULT_PROFILER_CALL_TARGET);
++
++ // If initReg is one of RBM_CALLEE_TRASH, then it needs to be zero'ed before using.
++ if ((RBM_CALLEE_TRASH & genRegMask(initReg)) != 0)
++ {
++ *pInitRegZeroed = false;
++ }
++
++#endif // !defined(UNIX_AMD64_ABI)
++
+ #elif defined(_TARGET_X86_) || (defined(_TARGET_ARM_) && defined(LEGACY_BACKEND))
+
+ unsigned saveStackLvl2 = genStackLevel;
+@@ -7673,6 +7728,7 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
+ //
+ void CodeGen::genProfilingLeaveCallback(unsigned helper /*= CORINFO_HELP_PROF_FCN_LEAVE*/)
+ {
++
+ assert((helper == CORINFO_HELP_PROF_FCN_LEAVE) || (helper == CORINFO_HELP_PROF_FCN_TAILCALL));
+
+ // Only hook if profiler says it's okay.
+@@ -7686,7 +7742,8 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper /*= CORINFO_HELP_PROF_FC
+ // Need to save on to the stack level, since the helper call will pop the argument
+ unsigned saveStackLvl2 = genStackLevel;
+
+-#if defined(_TARGET_AMD64_) && !defined(UNIX_AMD64_ABI) // No profiling for System V systems yet.
++#if defined(_TARGET_AMD64_)
++#if !defined(UNIX_AMD64_ABI)
+
+ // Since the method needs to make a profiler callback, it should have out-going arg space allocated.
+ noway_assert(compiler->lvaOutgoingArgSpaceVar != BAD_VAR_NUM);
+@@ -7757,6 +7814,48 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper /*= CORINFO_HELP_PROF_FC
+ // "mov r8, helper addr; call r8"
+ genEmitHelperCall(helper, 0, EA_UNKNOWN, REG_ARG_2);
+
++#else // !defined(UNIX_AMD64_ABI)
++
++ // RDI = ProfilerMethHnd
++ if (compiler->compProfilerMethHndIndirected)
++ {
++ getEmitter()->emitIns_R_AI(INS_mov, EA_PTR_DSP_RELOC, REG_ARG_0, (ssize_t)compiler->compProfilerMethHnd);
++ }
++ else
++ {
++ if (compiler->opts.compJitELTHookEnabled)
++ {
++ genSetRegToIcon(REG_ARG_0, (ssize_t)compiler->compProfilerMethHnd, TYP_I_IMPL);
++ }
++ else
++ {
++ instGen_Set_Reg_To_Imm(EA_8BYTE, REG_ARG_0, (ssize_t)compiler->compProfilerMethHnd);
++ }
++ }
++
++ // RSI = caller's SP
++ if (compiler->lvaDoneFrameLayout == Compiler::FINAL_FRAME_LAYOUT)
++ {
++ int callerSPOffset = compiler->lvaToCallerSPRelativeOffset(0, isFramePointerUsed());
++ getEmitter()->emitIns_R_AR(INS_lea, EA_PTRSIZE, REG_ARG_1, genFramePointerReg(), -callerSPOffset);
++ }
++ else
++ {
++ LclVarDsc* varDsc = compiler->lvaTable;
++ NYI_IF((varDsc == nullptr) || !varDsc->lvIsParam, "Profiler ELT callback for a method without any params");
++
++ // lea rdx, [FramePointer + Arg0's offset]
++ getEmitter()->emitIns_R_S(INS_lea, EA_PTRSIZE, REG_ARG_1, 0, 0);
++ }
++
++ // We can use any callee trash register (other than RAX, RDI, RSI) for call target.
++ // We use R11 here. This will emit either
++ // "call ip-relative 32-bit offset" or
++ // "mov r11, helper addr; call r11"
++ genEmitHelperCall(helper, 0, EA_UNKNOWN, REG_DEFAULT_PROFILER_CALL_TARGET);
++
++#endif // !defined(UNIX_AMD64_ABI)
++
+ #elif defined(_TARGET_X86_)
+
+ //
+@@ -8198,6 +8297,14 @@ void CodeGen::genFinalizeFrame()
+ regSet.rsSetRegsModified(RBM_INT_CALLEE_SAVED & ~RBM_FPBASE);
+ }
+
++#ifdef UNIX_AMD64_ABI
++ // On Unix x64 we also save R14 and R15 for ELT profiler hook generation.
++ if (compiler->compIsProfilerHookNeeded())
++ {
++ regSet.rsSetRegsModified(RBM_PROFILER_ENTER_ARG_0 | RBM_PROFILER_ENTER_ARG_1);
++ }
++#endif
++
+ /* Count how many callee-saved registers will actually be saved (pushed) */
+
+ // EBP cannot be (directly) modified for EBP frame and double-aligned frames
+diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp
+index 252f004..fa2c22b 100644
+--- a/src/jit/codegenxarch.cpp
++++ b/src/jit/codegenxarch.cpp
+@@ -1219,16 +1219,51 @@ void CodeGen::genReturn(GenTreePtr treeNode)
+ // Since we are invalidating the assumption that we would slip into the epilog
+ // right after the "return", we need to preserve the return reg's GC state
+ // across the call until actual method return.
++ ReturnTypeDesc retTypeDesc;
++ unsigned regCount;
++ if (compiler->compMethodReturnsMultiRegRetType())
++ {
++ if (varTypeIsLong(compiler->info.compRetNativeType))
++ {
++ retTypeDesc.InitializeLongReturnType(compiler);
++ }
++ else // we must have a struct return type
++ {
++ retTypeDesc.InitializeStructReturnType(compiler, compiler->info.compMethodInfo->args.retTypeClass);
++ }
++ regCount = retTypeDesc.GetReturnRegCount();
++ }
++
+ if (varTypeIsGC(compiler->info.compRetType))
+ {
+ gcInfo.gcMarkRegPtrVal(REG_INTRET, compiler->info.compRetType);
+ }
++ else if (compiler->compMethodReturnsMultiRegRetType())
++ {
++ for (unsigned i = 0; i < regCount; ++i)
++ {
++ if (varTypeIsGC(retTypeDesc.GetReturnRegType(i)))
++ {
++ gcInfo.gcMarkRegPtrVal(retTypeDesc.GetABIReturnReg(i), retTypeDesc.GetReturnRegType(i));
++ }
++ }
++ }
+
+ genProfilingLeaveCallback();
+
+ if (varTypeIsGC(compiler->info.compRetType))
+ {
+- gcInfo.gcMarkRegSetNpt(REG_INTRET);
++ gcInfo.gcMarkRegSetNpt(genRegMask(REG_INTRET));
++ }
++ else if (compiler->compMethodReturnsMultiRegRetType())
++ {
++ for (unsigned i = 0; i < regCount; ++i)
++ {
++ if (varTypeIsGC(retTypeDesc.GetReturnRegType(i)))
++ {
++ gcInfo.gcMarkRegSetNpt(genRegMask(retTypeDesc.GetABIReturnReg(i)));
++ }
++ }
+ }
+ }
+ #endif
+@@ -8244,7 +8279,6 @@ void CodeGen::genPutStructArgStk(GenTreePutArgStk* putArgStk)
+ var_types memType = (gcPtrs[i] == TYPE_GC_REF) ? TYP_REF : TYP_BYREF;
+ getEmitter()->emitIns_R_AR(ins_Load(memType), emitTypeSize(memType), REG_RCX, REG_RSI, 0);
+ genStoreRegToStackArg(memType, REG_RCX, i * TARGET_POINTER_SIZE);
+-
+ #ifdef DEBUG
+ numGCSlotsCopied++;
+ #endif // DEBUG
+diff --git a/src/jit/compiler.cpp b/src/jit/compiler.cpp
+index 1c24b93..ccda4f5 100644
+--- a/src/jit/compiler.cpp
++++ b/src/jit/compiler.cpp
+@@ -6839,6 +6839,29 @@ void Compiler::GetStructTypeOffset(const SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSIN
+ *type1 = GetEightByteType(structDesc, 1);
+ }
+ }
++
++//------------------------------------------------------------------------------------------------------
++// GetStructTypeOffset: Gets the type, size and offset of the eightbytes of a struct for System V systems.
++//
++// Arguments:
++// 'typeHnd' - type handle
++// 'type0' - out param; returns the type of the first eightbyte.
++// 'type1' - out param; returns the type of the second eightbyte.
++// 'offset0' - out param; returns the offset of the first eightbyte.
++// 'offset1' - out param; returns the offset of the second eightbyte.
++//
++void Compiler::GetStructTypeOffset(CORINFO_CLASS_HANDLE typeHnd,
++ var_types* type0,
++ var_types* type1,
++ unsigned __int8* offset0,
++ unsigned __int8* offset1)
++{
++ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR structDesc;
++ eeGetSystemVAmd64PassStructInRegisterDescriptor(typeHnd, &structDesc);
++ assert(structDesc.passedInRegisters);
++ GetStructTypeOffset(structDesc, type0, type1, offset0, offset1);
++}
++
+ #endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+
+ /*****************************************************************************/
+diff --git a/src/jit/compiler.h b/src/jit/compiler.h
+index 5bff8dd..bf7aaac 100644
+--- a/src/jit/compiler.h
++++ b/src/jit/compiler.h
+@@ -9253,11 +9253,19 @@ public:
+ static var_types GetTypeFromClassificationAndSizes(SystemVClassificationType classType, int size);
+ static var_types GetEightByteType(const SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR& structDesc,
+ unsigned slotNum);
++
+ static void GetStructTypeOffset(const SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR& structDesc,
+ var_types* type0,
+ var_types* type1,
+ unsigned __int8* offset0,
+ unsigned __int8* offset1);
++
++ void GetStructTypeOffset(CORINFO_CLASS_HANDLE typeHnd,
++ var_types* type0,
++ var_types* type1,
++ unsigned __int8* offset0,
++ unsigned __int8* offset1);
++
+ void fgMorphSystemVStructArgs(GenTreeCall* call, bool hasStructArgument);
+ #endif // defined(FEATURE_UNIX_AMD64_STRUCT_PASSING)
+
+diff --git a/src/jit/lclvars.cpp b/src/jit/lclvars.cpp
+index 4770a1d..e540c7f 100644
+--- a/src/jit/lclvars.cpp
++++ b/src/jit/lclvars.cpp
+@@ -6147,7 +6147,7 @@ void Compiler::lvaAlignFrame()
+ // On AMD64-Unix, there are no such slots. There is a possibility to have calls in the method with frame size of 0.
+ // The frame alignment logic won't kick in. This flags takes care of the AMD64-Unix case by remembering that there
+ // are calls and making sure the frame alignment logic is executed.
+- bool stackNeedsAlignment = (compLclFrameSize != 0 || opts.compNeedToAlignFrame);
++ bool stackNeedsAlignment = (compLclFrameSize != 0 || opts.compNeedToAlignFrame || compIsProfilerHookNeeded());
+ #else // !UNIX_AMD64_ABI
+ bool stackNeedsAlignment = compLclFrameSize != 0;
+ #endif // !UNIX_AMD64_ABI
+diff --git a/src/jit/target.h b/src/jit/target.h
+index 9fa5e33..8330139 100644
+--- a/src/jit/target.h
++++ b/src/jit/target.h
+@@ -830,6 +830,13 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
+ #define RBM_FLT_CALLEE_SAVED (0)
+ #define RBM_FLT_CALLEE_TRASH (RBM_XMM0|RBM_XMM1|RBM_XMM2|RBM_XMM3|RBM_XMM4|RBM_XMM5|RBM_XMM6|RBM_XMM7| \
+ RBM_XMM8|RBM_XMM9|RBM_XMM10|RBM_XMM11|RBM_XMM12|RBM_XMM13|RBM_XMM14|RBM_XMM15)
++ #define REG_PROFILER_ENTER_ARG_0 REG_R14
++ #define RBM_PROFILER_ENTER_ARG_0 RBM_R14
++ #define REG_PROFILER_ENTER_ARG_1 REG_R15
++ #define RBM_PROFILER_ENTER_ARG_1 RBM_R15
++
++ #define REG_DEFAULT_PROFILER_CALL_TARGET REG_R11
++
+ #else // !UNIX_AMD64_ABI
+ #define MIN_ARG_AREA_FOR_CALL (4 * REGSIZE_BYTES) // Minimum required outgoing argument space for a call.
+
+@@ -976,7 +983,7 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
+ // profiler.
+ #define REG_DEFAULT_HELPER_CALL_TARGET REG_RAX
+
+- // GenericPInvokeCalliHelper VASigCookie Parameter
++ // GenericPInvokeCalliHelper VASigCookie Parameter
+ #define REG_PINVOKE_COOKIE_PARAM REG_R11
+ #define RBM_PINVOKE_COOKIE_PARAM RBM_R11
+ #define PREDICT_REG_PINVOKE_COOKIE_PARAM PREDICT_REG_R11
+diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt
+index 835e31c..00c7d04 100644
+--- a/src/vm/CMakeLists.txt
++++ b/src/vm/CMakeLists.txt
+@@ -368,6 +368,7 @@ else(WIN32)
+
+ if(CLR_CMAKE_TARGET_ARCH_AMD64)
+ set(VM_SOURCES_WKS_ARCH_ASM
++ ${ARCH_SOURCES_DIR}/asmhelpers.S
+ ${ARCH_SOURCES_DIR}/calldescrworkeramd64.S
+ ${ARCH_SOURCES_DIR}/crthelpers.S
+ ${ARCH_SOURCES_DIR}/externalmethodfixupthunk.S
+diff --git a/src/vm/amd64/asmhelpers.S b/src/vm/amd64/asmhelpers.S
+new file mode 100644
+index 0000000..0f0ca07
+--- /dev/null
++++ b/src/vm/amd64/asmhelpers.S
+@@ -0,0 +1,289 @@
++// Licensed to the .NET Foundation under one or more agreements.
++// The .NET Foundation licenses this file to you under the MIT license.
++// See the LICENSE file in the project root for more information.
++
++.intel_syntax noprefix
++#include "unixasmmacros.inc"
++#include "asmconstants.h"
++
++#define real4 dword
++#define real8 qword
++
++//
++// file: profile.cpp
++// typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
++// {
++// FunctionID *functionId; // function ID comes in the r11 register
++// void *rbp;
++// void *probersp;
++// void *ip;
++// void *profiledRsp;
++// UINT64 rax;
++// LPVOID hiddenArg;
++// UINT64 flt0;
++// UINT64 flt1;
++// UINT64 flt2;
++// UINT64 flt3;
++// #if defined(UNIX_AMD64_ABI)
++// UINT64 flt4;
++// UINT64 flt5;
++// UINT64 flt6;
++// UINT64 flt7;
++// UINT64 rdi;
++// UINT64 rsi;
++// UINT64 rdx;
++// UINT64 rcx;
++// UINT64 r8;
++// UINT64 r9;
++// #endif
++// UINT32 flags;
++// } PROFILE_PLATFORM_SPECIFIC_DATA, *PPROFILE_PLATFORM_SPECIFIC_DATA;
++//
++.equ SIZEOF_PROFILE_PLATFORM_SPECIFIC_DATA, 0x8*21 + 0x4*2 // includes fudge to make FP_SPILL right
++.equ SIZEOF_FP_ARG_SPILL, 0x10*2
++
++.equ OFFSETOF_FP_ARG_SPILL_0, SIZEOF_PROFILE_PLATFORM_SPECIFIC_DATA
++.equ OFFSETOF_FP_ARG_SPILL_1, OFFSETOF_FP_ARG_SPILL_0 + 0x10
++
++.equ SIZEOF_STACK_FRAME, SIZEOF_PROFILE_PLATFORM_SPECIFIC_DATA + SIZEOF_FP_ARG_SPILL + 0x8
++
++.equ PROFILE_ENTER, 0x1
++.equ PROFILE_LEAVE, 0x2
++.equ PROFILE_TAILCALL, 0x4
++
++// ***********************************************************
++// NOTE:
++//
++// Register preservation scheme:
++//
++// Preserved:
++// - all non-volatile registers
++// - rax, rdx
++// - xmm0, xmm1
++//
++// Not Preserved:
++// - integer argument registers (rcx, rdx, r8, r9)
++// - floating point argument registers (xmm1-3)
++// - volatile integer registers (r10, r11)
++// - volatile floating point registers (xmm4-5)
++// - upper halves of ymm registers on AVX (which are volatile)
++//
++// ***********************************************************
++
++// EXTERN_C void ProfileEnterNaked(FunctionIDOrClientID functionIDOrClientID, size_t profiledRsp);
++// <NOTE>
++//
++// </NOTE>
++NESTED_ENTRY ProfileEnterNaked, _TEXT, NoHandler
++ // Upon entry :
++ // r14 = clientInfo
++ // r15 = profiledRsp
++
++ push_nonvol_reg rax
++
++ lea rax, [rsp + 0x10] // caller rsp
++ mov r10, [rax - 0x8] // return address
++
++ push_argument_register rdx
++ alloc_stack SIZEOF_STACK_FRAME
++
++ // correctness of return value in structure doesn't matter for enter probe
++
++ // setup ProfilePlatformSpecificData structure
++ xor r11, r11 // nullify r11
++ mov [rsp + 0x0], r11 // r11 is null -- struct functionId field
++ save_reg_postrsp rbp, 0x8 // -- struct rbp field
++ mov [rsp + 0x10], rax // caller rsp -- struct probeRsp field
++ mov [rsp + 0x18], r10 // return address -- struct ip field
++ mov [rsp + 0x20], r15 // -- struct profiledRsp field
++ mov [rsp + 0x28], r11 // return value -- struct rax field
++ mov [rsp + 0x30], r11 // r11 is null -- struct hiddenArg field
++ movsd real8 ptr [rsp + 0x38], xmm0 // -- struct flt0 field
++ movsd real8 ptr [rsp + 0x40], xmm1 // -- struct flt1 field
++ movsd real8 ptr [rsp + 0x48], xmm2 // -- struct flt2 field
++ movsd real8 ptr [rsp + 0x50], xmm3 // -- struct flt3 field
++ movsd real8 ptr [rsp + 0x58], xmm4 // -- struct flt4 field
++ movsd real8 ptr [rsp + 0x60], xmm5 // -- struct flt5 field
++ movsd real8 ptr [rsp + 0x68], xmm6 // -- struct flt6 field
++ movsd real8 ptr [rsp + 0x70], xmm7 // -- struct flt7 field
++ mov [rsp + 0x78], rdi // -- struct rdi field
++ mov [rsp + 0x80], rsi // -- struct rsi field
++ mov [rsp + 0x88], rdx // -- struct rdx field
++ mov [rsp + 0x90], rcx // -- struct rcx field
++ mov [rsp + 0x98], r8 // -- struct r8 field
++ mov [rsp + 0xa0], r9 // -- struct r9 field
++ mov r10, 0x1 // PROFILE_ENTER
++ mov [rsp + 0xa8], r10d // -- struct flags field
++
++ // we need to be able to restore the fp return register
++ save_xmm128_postrsp xmm0, OFFSETOF_FP_ARG_SPILL_0
++ save_xmm128_postrsp xmm1, OFFSETOF_FP_ARG_SPILL_1
++ END_PROLOGUE
++
++ // rdi already contains the clientInfo
++ mov rdi, r14
++ lea rsi, [rsp + 0x0]
++ call C_FUNC(ProfileEnter)
++
++ // restore arg registers
++ mov rdi, [rsp + 0x78]
++ mov rsi, [rsp + 0x80]
++ mov rdx, [rsp + 0x88]
++ mov rcx, [rsp + 0x90]
++ mov r8, [rsp + 0x98]
++ mov r9, [rsp + 0xa0]
++
++ // restore fp return register
++ movdqa xmm0, [rsp + OFFSETOF_FP_ARG_SPILL_0]
++ movdqa xmm1, [rsp + OFFSETOF_FP_ARG_SPILL_1]
++
++ // begin epilogue
++ free_stack SIZEOF_STACK_FRAME
++ pop_argument_register rdx
++
++ pop_nonvol_reg rax
++
++ ret
++NESTED_END ProfileEnterNaked, _TEXT
++
++// EXTERN_C void ProfileLeaveNaked(FunctionIDOrClientID functionIDOrClientID, size_t profiledRsp);
++// <NOTE>
++//
++// </NOTE>
++NESTED_ENTRY ProfileLeaveNaked, _TEXT, NoHandler
++// Upon entry :
++// rdi = clientInfo
++// rsi = profiledRsp
++
++ push_nonvol_reg rbx
++
++ lea rbx, [rsp + 0x10] // caller rsp
++ mov r10, [rbx - 0x8] // return address
++
++ // rdx should be saved here because it can be used for returning struct values
++ push_argument_register rdx
++ alloc_stack SIZEOF_STACK_FRAME
++
++ // correctness of argument registers in structure doesn't matter for leave probe
++
++ // setup ProfilePlatformSpecificData structure
++ xor r11, r11 // nullify r11
++ mov [rsp + 0x0], r11 // r11 is null -- struct functionId field
++ save_reg_postrsp rbp, 0x8 // -- struct rbp field
++ mov [rsp + 0x10], rbx // caller rsp -- struct probeRsp field
++ mov [rsp + 0x18], r10 // return address -- struct ip field
++ mov [rsp + 0x20], rsi // -- struct profiledRsp field
++ mov [rsp + 0x28], rax // return value -- struct rax field
++ mov [rsp + 0x30], r11 // r11 is null -- struct hiddenArg field
++ movsd real8 ptr [rsp + 0x38], xmm0 // -- struct flt0 field
++ movsd real8 ptr [rsp + 0x40], xmm1 // -- struct flt1 field
++ movsd real8 ptr [rsp + 0x48], xmm2 // -- struct flt2 field
++ movsd real8 ptr [rsp + 0x50], xmm3 // -- struct flt3 field
++ movsd real8 ptr [rsp + 0x58], xmm4 // -- struct flt4 field
++ movsd real8 ptr [rsp + 0x60], xmm5 // -- struct flt5 field
++ movsd real8 ptr [rsp + 0x68], xmm6 // -- struct flt6 field
++ movsd real8 ptr [rsp + 0x70], xmm7 // -- struct flt7 field
++ mov [rsp + 0x78], r11 // -- struct rdi field
++ mov [rsp + 0x80], r11 // -- struct rsi field
++ mov [rsp + 0x88], r11 // -- struct rdx field
++ mov [rsp + 0x90], r11 // -- struct rcx field
++ mov [rsp + 0x98], r11 // -- struct r8 field
++ mov [rsp + 0xa0], r11 // -- struct r9 field
++ mov r10, 0x2 // PROFILE_LEAVE
++ mov [rsp + 0xa8], r10d // flags -- struct flags field
++
++ // we need to be able to restore the fp return register
++ save_xmm128_postrsp xmm0, OFFSETOF_FP_ARG_SPILL_0
++ save_xmm128_postrsp xmm1, OFFSETOF_FP_ARG_SPILL_1
++ END_PROLOGUE
++
++ // rdi already contains the clientInfo
++ lea rsi, [rsp + 0x0]
++ call C_FUNC(ProfileLeave)
++
++ // restore fp return register
++ movdqa xmm0, [rsp + OFFSETOF_FP_ARG_SPILL_0]
++ movdqa xmm1, [rsp + OFFSETOF_FP_ARG_SPILL_1]
++
++ // restore int return register
++ mov rax, [rsp + 0x28]
++
++ // begin epilogue
++ free_stack SIZEOF_STACK_FRAME
++ pop_argument_register rdx
++
++ pop_nonvol_reg rbx
++
++ ret
++NESTED_END ProfileLeaveNaked, _TEXT
++
++// EXTERN_C void ProfileTailcallNaked(FunctionIDOrClientID functionIDOrClientID, size_t profiledRsp);
++// <NOTE>
++//
++// </NOTE>
++NESTED_ENTRY ProfileTailcallNaked, _TEXT, NoHandler
++// Upon entry :
++// rdi = clientInfo
++// rsi = profiledRsp
++
++ push_nonvol_reg rbx
++
++ lea rbx, [rsp + 0x10] // caller rsp
++ mov r10, [rbx - 0x8] // return address
++
++ // rdx should be saved here because it can be used for returning struct values
++ push_argument_register rdx
++ alloc_stack SIZEOF_STACK_FRAME
++
++ // correctness of argument registers in structure doesn't matter for tailcall probe
++
++ // setup ProfilePlatformSpecificData structure
++ xor r11, r11 // nullify r11
++ mov [rsp + 0x0], r11 // r11 is null -- struct functionId field
++ save_reg_postrsp rbp, 0x8 // -- struct rbp field
++ mov [rsp + 0x10], rbx // caller rsp -- struct probeRsp field
++ mov [rsp + 0x18], r10 // return address -- struct ip field
++ mov [rsp + 0x20], rsi // -- struct profiledRsp field
++ mov [rsp + 0x28], rax // return value -- struct rax field
++ mov [rsp + 0x30], r11 // r11 is null -- struct hiddenArg field
++ movsd real8 ptr [rsp + 0x38], xmm0 // -- struct flt0 field
++ movsd real8 ptr [rsp + 0x40], xmm1 // -- struct flt1 field
++ movsd real8 ptr [rsp + 0x48], xmm2 // -- struct flt2 field
++ movsd real8 ptr [rsp + 0x50], xmm3 // -- struct flt3 field
++ movsd real8 ptr [rsp + 0x58], xmm4 // -- struct flt4 field
++ movsd real8 ptr [rsp + 0x60], xmm5 // -- struct flt5 field
++ movsd real8 ptr [rsp + 0x68], xmm6 // -- struct flt6 field
++ movsd real8 ptr [rsp + 0x70], xmm7 // -- struct flt7 field
++ mov [rsp + 0x78], r11 // -- struct rdi field
++ mov [rsp + 0x80], r11 // -- struct rsi field
++ mov [rsp + 0x88], r11 // -- struct rdx field
++ mov [rsp + 0x90], r11 // -- struct rcx field
++ mov [rsp + 0x98], r11 // -- struct r8 field
++ mov [rsp + 0xa0], r11 // -- struct r9 field
++ mov r10, 0x2 // PROFILE_LEAVE
++ mov [rsp + 0xa8], r10d // flags -- struct flags field
++
++ // we need to be able to restore the fp return register
++ save_xmm128_postrsp xmm0, OFFSETOF_FP_ARG_SPILL_0
++ save_xmm128_postrsp xmm1, OFFSETOF_FP_ARG_SPILL_1
++ END_PROLOGUE
++
++ // rdi already contains the clientInfo
++ lea rsi, [rsp + 0x0]
++ call C_FUNC(ProfileTailcall)
++
++ // restore fp return register
++ movdqa xmm0, [rsp + OFFSETOF_FP_ARG_SPILL_0]
++ movdqa xmm1, [rsp + OFFSETOF_FP_ARG_SPILL_1]
++
++ // restore int return register
++ mov rax, [rsp + 0x28]
++
++ // begin epilogue
++ free_stack SIZEOF_STACK_FRAME
++ pop_argument_register rdx
++
++ pop_nonvol_reg rbx
++
++ ret
++NESTED_END ProfileTailcallNaked, _TEXT
+diff --git a/src/vm/amd64/profiler.cpp b/src/vm/amd64/profiler.cpp
+index e88cbba..a5563e4 100644
+--- a/src/vm/amd64/profiler.cpp
++++ b/src/vm/amd64/profiler.cpp
+@@ -36,6 +36,18 @@ typedef struct _PROFILE_PLATFORM_SPECIFIC_DATA
+ UINT64 flt1;
+ UINT64 flt2;
+ UINT64 flt3;
++#if defined(UNIX_AMD64_ABI)
++ UINT64 flt4;
++ UINT64 flt5;
++ UINT64 flt6;
++ UINT64 flt7;
++ UINT64 rdi;
++ UINT64 rsi;
++ UINT64 rdx;
++ UINT64 rcx;
++ UINT64 r8;
++ UINT64 r9;
++#endif
+ UINT32 flags;
+ } PROFILE_PLATFORM_SPECIFIC_DATA, *PPROFILE_PLATFORM_SPECIFIC_DATA;
+
+diff --git a/src/vm/amd64/unixstubs.cpp b/src/vm/amd64/unixstubs.cpp
+index 76d3cf1..83764e0 100644
+--- a/src/vm/amd64/unixstubs.cpp
++++ b/src/vm/amd64/unixstubs.cpp
+@@ -11,21 +11,6 @@ extern "C"
+ PORTABILITY_ASSERT("Implement for PAL");
+ }
+
+- void ProfileEnterNaked(FunctionIDOrClientID functionIDOrClientID)
+- {
+- PORTABILITY_ASSERT("Implement for PAL");
+- }
+-
+- void ProfileLeaveNaked(FunctionIDOrClientID functionIDOrClientID)
+- {
+- PORTABILITY_ASSERT("Implement for PAL");
+- }
+-
+- void ProfileTailcallNaked(FunctionIDOrClientID functionIDOrClientID)
+- {
+- PORTABILITY_ASSERT("Implement for PAL");
+- }
+-
+ DWORD getcpuid(DWORD arg, unsigned char result[16])
+ {
+ DWORD eax;
+--
+1.9.1
+
diff --git a/packaging/0020-Enable-loading-directly-ni-file-for-dotnet-launcher.patch b/packaging/0020-Enable-loading-directly-ni-file-for-dotnet-launcher.patch
new file mode 100644
index 0000000000..fd7a8ec6d9
--- /dev/null
+++ b/packaging/0020-Enable-loading-directly-ni-file-for-dotnet-launcher.patch
@@ -0,0 +1,40 @@
+From 3ead73093ab67643a6f313f2148812c3ad668d7c Mon Sep 17 00:00:00 2001
+From: Yongseop Kim <yons.kim@samsung.com>
+Date: Mon, 4 Sep 2017 15:41:57 +0900
+Subject: [PATCH 20/23] Enable loading directly ni file for dotnet-launcher
+
+---
+ src/vm/appdomain.cpp | 3 ++-
+ src/vm/coreassemblyspec.cpp | 2 +-
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp
+index bd05991..2b1ae1a 100644
+--- a/src/vm/appdomain.cpp
++++ b/src/vm/appdomain.cpp
+@@ -7180,7 +7180,8 @@ EndTry2:;
+ // Use CoreClr's fusion alternative
+ CoreBindResult bindResult;
+
+- pSpec->Bind(this, fThrowOnFileNotFound, &bindResult, FALSE /* fNgenExplicitBind */, FALSE /* fExplicitBindToNativeImage */, pCallerStackMark);
++ BOOL fExplicitBindToNativeImage = (g_fAllowNativeImages) ? TRUE: FALSE;
++ pSpec->Bind(this, fThrowOnFileNotFound, &bindResult, FALSE /* fNgenExplicitBind */, fExplicitBindToNativeImage, pCallerStackMark);
+ hrBindResult = bindResult.GetHRBindResult();
+
+ if (bindResult.Found())
+diff --git a/src/vm/coreassemblyspec.cpp b/src/vm/coreassemblyspec.cpp
+index 1d3567e..2c3fba5 100644
+--- a/src/vm/coreassemblyspec.cpp
++++ b/src/vm/coreassemblyspec.cpp
+@@ -163,7 +163,7 @@ VOID AssemblySpec::Bind(AppDomain *pAppDomain,
+ else if(m_wszCodeBase==NULL)
+ {
+ // For name based binding these arguments shouldnt have been changed from default
+- _ASSERTE(!fNgenExplicitBind && !fExplicitBindToNativeImage);
++ //_ASSERTE(!fNgenExplicitBind && !fExplicitBindToNativeImage);
+ SafeComHolder<IAssemblyName> pName;
+ hr = CreateAssemblyNameObject(&pName, assemblyDisplayName, CANOF_PARSE_DISPLAY_NAME, NULL);
+ if (SUCCEEDED(hr))
+--
+1.9.1
+
diff --git a/packaging/0021-Revert-Enable-loading-directly-ni-file-for-dotnet-la.patch b/packaging/0021-Revert-Enable-loading-directly-ni-file-for-dotnet-la.patch
new file mode 100644
index 0000000000..26ec8ff990
--- /dev/null
+++ b/packaging/0021-Revert-Enable-loading-directly-ni-file-for-dotnet-la.patch
@@ -0,0 +1,42 @@
+From dd38848702a4d5b9aed45f4b6ff77b16141a764e Mon Sep 17 00:00:00 2001
+From: Yongseop Kim <yons.kim@samsung.com>
+Date: Tue, 5 Sep 2017 18:00:39 +0900
+Subject: [PATCH 21/23] Revert "Enable loading directly ni file for
+ dotnet-launcher"
+
+This reverts commit 3ead73093ab67643a6f313f2148812c3ad668d7c.
+---
+ src/vm/appdomain.cpp | 3 +--
+ src/vm/coreassemblyspec.cpp | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp
+index 2b1ae1a..bd05991 100644
+--- a/src/vm/appdomain.cpp
++++ b/src/vm/appdomain.cpp
+@@ -7180,8 +7180,7 @@ EndTry2:;
+ // Use CoreClr's fusion alternative
+ CoreBindResult bindResult;
+
+- BOOL fExplicitBindToNativeImage = (g_fAllowNativeImages) ? TRUE: FALSE;
+- pSpec->Bind(this, fThrowOnFileNotFound, &bindResult, FALSE /* fNgenExplicitBind */, fExplicitBindToNativeImage, pCallerStackMark);
++ pSpec->Bind(this, fThrowOnFileNotFound, &bindResult, FALSE /* fNgenExplicitBind */, FALSE /* fExplicitBindToNativeImage */, pCallerStackMark);
+ hrBindResult = bindResult.GetHRBindResult();
+
+ if (bindResult.Found())
+diff --git a/src/vm/coreassemblyspec.cpp b/src/vm/coreassemblyspec.cpp
+index 2c3fba5..1d3567e 100644
+--- a/src/vm/coreassemblyspec.cpp
++++ b/src/vm/coreassemblyspec.cpp
+@@ -163,7 +163,7 @@ VOID AssemblySpec::Bind(AppDomain *pAppDomain,
+ else if(m_wszCodeBase==NULL)
+ {
+ // For name based binding these arguments shouldnt have been changed from default
+- //_ASSERTE(!fNgenExplicitBind && !fExplicitBindToNativeImage);
++ _ASSERTE(!fNgenExplicitBind && !fExplicitBindToNativeImage);
+ SafeComHolder<IAssemblyName> pName;
+ hr = CreateAssemblyNameObject(&pName, assemblyDisplayName, CANOF_PARSE_DISPLAY_NAME, NULL);
+ if (SUCCEEDED(hr))
+--
+1.9.1
+
diff --git a/packaging/0022-Enable-loading-directly-ni-file-for-corerun-temporar.patch b/packaging/0022-Enable-loading-directly-ni-file-for-corerun-temporar.patch
new file mode 100644
index 0000000000..077650bbba
--- /dev/null
+++ b/packaging/0022-Enable-loading-directly-ni-file-for-corerun-temporar.patch
@@ -0,0 +1,32 @@
+From 327402c5c08bdbb3903735b20b76fe1d73819eb9 Mon Sep 17 00:00:00 2001
+From: Yongseop Kim <yons.kim@samsung.com>
+Date: Tue, 5 Sep 2017 18:03:34 +0900
+Subject: [PATCH 22/23] Enable loading directly ni file for corerun temporarily
+
+---
+ src/coreclr/hosts/unixcoreruncommon/coreruncommon.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/coreclr/hosts/unixcoreruncommon/coreruncommon.cpp b/src/coreclr/hosts/unixcoreruncommon/coreruncommon.cpp
+index f97f262..a1db5c1 100644
+--- a/src/coreclr/hosts/unixcoreruncommon/coreruncommon.cpp
++++ b/src/coreclr/hosts/unixcoreruncommon/coreruncommon.cpp
+@@ -314,6 +314,7 @@ int ExecuteManagedAssembly(
+ GetDirectory(managedAssemblyAbsolutePath, appPath);
+
+ std::string tpaList;
++ /*
+ if (strlen(managedAssemblyAbsolutePath) > 0)
+ {
+ // Target assembly should be added to the tpa list. Otherwise corerun.exe
+@@ -322,6 +323,7 @@ int ExecuteManagedAssembly(
+ tpaList = managedAssemblyAbsolutePath;
+ tpaList.append(":");
+ }
++ */
+
+ // Construct native search directory paths
+ std::string nativeDllSearchDirs(appPath);
+--
+1.9.1
+
diff --git a/packaging/0023-Add-Tizen-RuntimeID-case.patch b/packaging/0023-Add-Tizen-RuntimeID-case.patch
new file mode 100644
index 0000000000..44ccf3a8ec
--- /dev/null
+++ b/packaging/0023-Add-Tizen-RuntimeID-case.patch
@@ -0,0 +1,56 @@
+From 1ef080f2e3b158042ce162876e4f781834993c0e Mon Sep 17 00:00:00 2001
+From: Jiyoung Yun <jy910.yun@samsung.com>
+Date: Wed, 14 Jun 2017 16:36:56 +0900
+Subject: [PATCH 23/23] Add Tizen RuntimeID case
+
+Change-Id: I8c52d2993dd1414ede6ff1e40e949af58bca9d40
+---
+ build.sh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/build.sh b/build.sh
+index 6590e83..3467387 100755
+--- a/build.sh
++++ b/build.sh
+@@ -414,12 +414,19 @@ isMSBuildOnNETCoreSupported()
+ "alpine.3.4.3-x64")
+ __isMSBuildOnNETCoreSupported=1
+ ;;
++ "tizen"*)
++ __isMSBuildOnNETCoreSupported=1
++ ;;
+ *)
+ __isMSBuildOnNETCoreSupported=$__msbuildonunsupportedplatform
+ esac
+ elif [ "$__HostOS" == "OSX" ]; then
+ __isMSBuildOnNETCoreSupported=1
+ fi
++ elif [ "$__HostArch" == "arm" ]; then
++ __isMSBuildOnNETCoreSupported=1
++ elif [ "$__HostArch" == "x86" ]; then
++ __isMSBuildOnNETCoreSupported=1
+ fi
+ }
+
+@@ -475,12 +482,18 @@ build_CoreLib()
+ # The cross build generates a crossgen with the target architecture.
+ if [ $__CrossBuild != 1 ]; then
+ # The architecture of host pc must be same architecture with target.
++ if [[ ( "$__HostArch" == "x86") ]]; then
++ exit 0
++ fi
++
+ if [[ ( "$__HostArch" == "$__BuildArch" ) ]]; then
+ build_CoreLib_ni
+ elif [[ ( "$__HostArch" == "x64" ) && ( "$__BuildArch" == "x86" ) ]]; then
+ build_CoreLib_ni
+ elif [[ ( "$__HostArch" == "arm64" ) && ( "$__BuildArch" == "arm" ) ]]; then
+ build_CoreLib_ni
++ elif [[ ( "$__HostArch" == "arm" ) && ( "$__BuildArch" == "armel" ) ]]; then
++ exit 0
+ else
+ exit 1
+ fi
+--
+1.9.1
+
diff --git a/packaging/coreclr-rpmlintrc b/packaging/coreclr-rpmlintrc
new file mode 100644
index 0000000000..edcdd8ed1d
--- /dev/null
+++ b/packaging/coreclr-rpmlintrc
@@ -0,0 +1,2 @@
+# This package should install an ELF binary in the /usr/share hierarchy.
+addFilter("E: arch-dependent-file-in-usr-share")
diff --git a/packaging/coreclr.manifest b/packaging/coreclr.manifest
new file mode 100644
index 0000000000..017d22d3af
--- /dev/null
+++ b/packaging/coreclr.manifest
@@ -0,0 +1,5 @@
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
diff --git a/packaging/coreclr.spec b/packaging/coreclr.spec
new file mode 100644
index 0000000000..771216b804
--- /dev/null
+++ b/packaging/coreclr.spec
@@ -0,0 +1,401 @@
+%{!?dotnet_buildtype: %define dotnet_buildtype Release}
+
+%define support_test 1
+%define skipnative 0
+%define skipmscorlib 0
+%ifarch %{ix86}
+%define dotnet_buildtype Debug
+%endif
+
+%define dotnet_version 2.0.0
+# git rev-parse --verify HEAD
+%define CORECLR_GIT_HASH 36f70fa4be4bd37d4d76d06dd2cc433ff46351bd
+
+Name: coreclr
+Version: 2.0.0.12082
+Release: 0
+Summary: Microsoft .NET Runtime, Coreclr
+Group: Development/Languages
+License: MIT
+URL: http://github.com/dotnet/coreclr
+Source0: %{name}-%{version}.tar.gz
+Source1000: downloaded_files.tar.gz
+Source1001: %{name}.manifest
+Source1002: libicu.tar.gz
+Source1003: dep_libs.tar.gz
+# Gbp-Ignore-Patches: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
+Patch0: 0001-Add-project.assets.json-files.patch
+Patch1: 0001-ARM-Linux-Support-unaligned-struct-read-write-11290.patch
+Patch2: 0002-x86-Linux-Thread-safe-UMThunkMarshInfo-RunTimeInit-1.patch
+Patch3: 0003-Enable-pow-for-arm-armel-in-tryrun-11703.patch
+Patch4: 0004-ARM-Linux-Validate-memory-using-ldrb-instead-of-ldr.patch
+Patch5: 0005-Add-skipped-testcase-on-TM1.patch
+Patch6: 0006-Set-local-variables-as-addr-exposed-if-it-appears-in.patch
+Patch7: 0007-Revert-unnecessary-changes.patch
+Patch8: 0008-Add-skipped-testcase-superpmi.patch
+Patch9: 0009-x86-Linux-Adjust-SP-in-throwing-helper-block-12504-1.patch
+Patch10: 0010-Use-udf-0xff-instead-of-bkpt-0xbe-as-a-poison-13.patch
+Patch11: 0011-Enable-sosplugin-on-ARM-14.patch
+Patch12: 0012-Add-pie-to-linker-option-16.patch
+Patch13: 0013-Revert-Add-pie-to-linker-option-16.patch
+Patch14: 0014-Fix-inconsistency-between-GetHasCode-and-Equals-1351.patch
+Patch15: 0015-Cherry-pick-13586.patch
+Patch16: 0016-callsignalhandlerwrapper-patch.patch
+Patch17: 0017-clear-cache-after-NI-reloc.patch
+Patch18: 0018-Support-FEATURE_GDBJIT_FRAME-including-NI-IL_Stub.patch
+Patch19: 0019-Add-profiling-support.patch
+Patch20: 0020-Enable-loading-directly-ni-file-for-dotnet-launcher.patch
+Patch21: 0021-Revert-Enable-loading-directly-ni-file-for-dotnet-la.patch
+Patch22: 0022-Enable-loading-directly-ni-file-for-corerun-temporar.patch
+Patch23: 0023-Add-Tizen-RuntimeID-case.patch
+Patch24: tizen-toolchain-support.patch
+
+ExcludeArch: aarch64
+
+BuildRequires: python
+BuildRequires: python-xml
+# libcoreclr.so
+BuildRequires: pkgconfig(libunwind)
+BuildRequires: pkgconfig(uuid)
+# System.Globalization.Native.so
+BuildRequires: libicu-devel
+BuildRequires: tizen-release
+# No matter what tizen-release package you use in any profile
+AutoReq: 0
+Requires: glibc
+Requires: libgcc
+Requires: libstdc++
+Requires: libunwind
+Requires: libuuid
+
+# Accelerate python, clang
+%ifarch %{arm}
+BuildRequires: python-accel-armv7l-cross-arm
+BuildRequires: clang-accel-armv7l-cross-arm
+%endif
+
+%ifarch aarch64
+BuildRequires: python-accel-aarch64-cross-aarch64
+BuildRequires: clang-accel-aarch64-cross-aarch64
+%endif
+
+%if 0%{skipnative}
+%else
+BuildRequires: cmake
+BuildRequires: llvm >= 3.8
+BuildRequires: llvm-devel >= 3.8
+BuildRequires: clang >= 3.8
+BuildRequires: clang-devel >= 3.8
+BuildRequires: lldb >= 3.8
+BuildRequires: lldb-devel >= 3.8
+BuildRequires: gettext-tools
+BuildRequires: libopenssl-devel
+# C include headers
+BuildRequires: libstdc++-devel
+BuildRequires: pkgconfig(lttng-ust)
+%endif
+
+%if 0%{skipmscorlib}
+%else
+%ifarch %{arm}
+BuildRequires: patchelf
+%endif
+%ifarch %{ix86}
+BuildRequires: patchelf
+BuildRequires: glibc-64bit
+BuildRequires: libgcc-64bit
+BuildRequires: libstdc++-64bit
+BuildRequires: libunwind-64bit
+BuildRequires: libuuid-64bit
+BuildRequires: zlib-64bit
+BuildRequires: libopenssl-64bit
+%endif
+%endif
+
+%description
+The CoreCLR repo contains the complete runtime implementation for .NET Core. It includes RyuJIT, the .NET GC, native interop and many other components. It is cross-platform, with multiple OS and CPU ports in progress.
+
+%package extra
+Summary: Dotnet Core Extra Files
+Requires: coreclr
+
+%description extra
+Libsosplugin and others
+
+%package test
+Summary: Dotnet Core Unit Test
+Requires: coreclr
+
+%description test
+Unit Test objs
+
+%package devel
+Summary: Dotnet Core Development package
+Requires: coreclr
+
+%description devel
+Headers and static libraries
+
+%package -n mscorlib
+Summary: Core Library for MS .NET
+Requires: coreclr
+
+%description -n mscorlib
+The MSCORLIB.DLL for .NET Core Runtime (coreclr)
+
+%prep
+%setup -q -n %{name}-%{version}
+cp %{SOURCE1001} .
+# Gbp-Patch-Macros
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
+%patch23 -p1
+%patch24 -p1
+
+%if 0%{skipmscorlib}
+%else
+cp %{SOURCE1000} ./
+tar xf %{SOURCE1000}
+%ifarch %{arm} %{ix86}
+%setup -T -D -a 1002
+%setup -T -D -a 1003
+%ifarch %{arm}
+# Detect interpreter name from cross-gcc
+LD_INTERPRETER=$(patchelf --print-interpreter /emul/usr/bin/gcc)
+LD_RPATH=$(patchelf --print-rpath /emul/usr/bin/gcc)
+for file in $( find ./Tools -name "dotnet" )
+do
+ patchelf --set-interpreter ${LD_INTERPRETER} ${file}
+ patchelf --set-rpath ${LD_RPATH}:%{_builddir}/%{name}-%{version}/libicu/ ${file}
+done
+for file in $( find ./Tools ./libicu -iname "*.so" -or -iname "*.so.*" )
+do
+ patchelf --set-rpath ${LD_RPATH}:%{_builddir}/%{name}-%{version}/libicu/ ${file}
+done
+%endif
+%ifarch %{ix86}
+for file in $( find ./Tools ./libicu -iname "*.so" -or -iname "*.so.*" )
+do
+ patchelf --set-rpath %{_builddir}/%{name}-%{version}/libicu/ ${file}
+done
+%endif
+%endif
+%endif
+
+%build
+
+export CFLAGS=" --target=%{_host} "
+export CXXFLAGS=" --target=%{_host} "
+
+%ifarch x86_64
+# Even though build architectur is x86_64, it will be running on arm board.
+# So we need to pass the arch argument as arm.
+%define _barch %{?cross:%{cross}}%{!?cross:x64}
+%else
+%ifarch aarch64
+%define _barch arm64
+%else
+%ifarch %{ix86}
+%define _barch x86
+export CLANG_NO_LIBDIR_SUFFIX=1
+export CFLAGS=$(echo $CFLAGS | sed -e 's/--target=i686/--target=i586/')
+export CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/--target=i686/--target=i586/')
+%else
+%ifarch %{arm}
+%define _barch armel
+export CLANG_NO_LIBDIR_SUFFIX=1
+%else
+
+%endif
+%endif
+%endif
+%endif
+
+%define _buildtype %{dotnet_buildtype}
+%define _reldir bin/Product/Linux.%{_barch}.%{_buildtype}
+%define _clrdebug 0
+%define _paldebug 0
+
+%if 0%{support_test}
+%define testopt ''
+%else
+%define testopt 'skiptests'
+%endif
+
+%if 0%{_clrdebug}
+export COMPlus_LogEnable=1
+export COMPlus_LogLevel=10
+export COMPlus_LogToFile=1
+export COMPlus_LogFile="clr.log"
+%else
+export COMPlus_LogEnable=0
+%endif
+
+%if 0%{_paldebug}
+export PAL_DBG_CHANNELS="+all.all"
+export PAL_DBG_CHANNELS="+PAL.TRACE:-FILE.ERROR"
+export PAL_API_TRACING="pal.log"
+%else
+export PAL_DBG_CHANNELS=""
+%endif
+
+%if 0%{skipmscorlib}
+%if 0%{skipnative}
+# No build native and mscorlib.
+%else
+# Build native only.
+./build.sh %{_barch} %{_buildtype} clang3.8 skipmscorlib skipgenerateversion skipnuget %{testopt} cmakeargs "-DFEATURE_GDBJIT=TRUE -DFEATURE_DBGIPC=0 -DFEATURE_NI_BIND_FALLBACK=false -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++"
+%endif
+%else
+%if 0%{skipnative}
+# Build mscorlib only.
+./build.sh %{_barch} %{_buildtype} -skiprestore skipnative skipnuget %{testopt}
+%else
+# Build native and mscorlib.
+./build.sh %{_barch} %{_buildtype} clang3.8 skipgenerateversion -skiprestore skipnuget %{testopt} cmakeargs "-DFEATURE_GDBJIT=TRUE -DFEATURE_DBGIPC=0 -DFEATURE_NI_BIND_FALLBACK=false -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++"
+%endif
+%endif
+
+echo %{CORECLR_GIT_HASH} > .clrinfo
+
+%install
+# .NET Core Runtime
+%define dotnetdir dotnet
+%define netshareddir %{dotnetdir}/shared
+%define netcoreappdir %{netshareddir}/Microsoft.NETCore.App/%{dotnet_version}
+mkdir -p %{buildroot}%{_datadir}/%{netcoreappdir}
+
+# .NET Tizen Runtime
+%define dotnettizendir dotnet.tizen
+%define dotnetfwdir %{dotnettizendir}/framework
+%define dotnettestdir %{dotnettizendir}/test
+mkdir -p %{buildroot}%{_datadir}/%{dotnettizendir}
+mkdir -p %{buildroot}%{_datadir}/%{dotnetfwdir}
+mkdir -p %{buildroot}%{_datadir}/%{dotnettestdir}
+
+# .NET & Mono CoreOverlay
+%define tizennetdir tizen.net
+mkdir -p %{buildroot}%{_datadir}/%{tizennetdir}
+
+%if 0%{skipnative}
+%else
+cp %{_reldir}/corerun %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libclrjit.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libcoreclr.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libdbgshim.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libmscordaccore.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libmscordbi.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libsos.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libsosplugin.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/libcoreclrtraceptprovider.so %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/System.Globalization.Native.so %{buildroot}%{_datadir}/%{netcoreappdir}
+ln -sf ../%{netcoreappdir}/corerun %{buildroot}%{_datadir}/%{dotnetdir}/corerun
+
+# .NET Core Headers and static libraries
+mkdir -p %{buildroot}%{_datadir}/%{netcoreappdir}/src/pal/src/
+cp -rf %{_reldir}/inc %{buildroot}%{_datadir}/%{netcoreappdir}/
+cp -rf src/inc %{buildroot}%{_datadir}/%{netcoreappdir}/src/
+cp -rf src/pal/inc %{buildroot}%{_datadir}/%{netcoreappdir}/src/pal/
+cp -rf %{_reldir}/lib %{buildroot}%{_datadir}/%{netcoreappdir}
+cp -rf src/pal/src/include %{buildroot}%{_datadir}/%{netcoreappdir}/src/pal/src
+
+# make link for .NET CoreOverlay
+ln -sf ../%{netcoreappdir}/corerun %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libclrjit.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libcoreclr.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libdbgshim.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libmscordaccore.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libmscordbi.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libsos.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libsosplugin.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/libcoreclrtraceptprovider.so %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/System.Globalization.Native.so %{buildroot}%{_datadir}/%{tizennetdir}
+
+# extra
+cp %{_reldir}/coreconsole %{buildroot}%{_datadir}/%{dotnetfwdir}
+cp %{_reldir}/crossgen %{buildroot}%{_datadir}/%{dotnetfwdir}
+cp %{_reldir}/ilasm %{buildroot}%{_datadir}/%{dotnetfwdir}
+cp %{_reldir}/ildasm %{buildroot}%{_datadir}/%{dotnetfwdir}
+
+# test
+cp -rf bin/obj/Linux.%{_barch}.%{_buildtype}/tests/src %{buildroot}%{_datadir}/%{dotnettestdir}
+
+# info
+cp -rf .clrinfo %{buildroot}%{_datadir}/%{tizennetdir}
+%endif
+
+%if 0%{skipmscorlib}
+%else
+cp %{_reldir}/System.Private.CoreLib.dll %{buildroot}%{_datadir}/%{netcoreappdir}
+cp %{_reldir}/SOS.NETCore.dll %{buildroot}%{_datadir}/%{netcoreappdir}
+
+# make link for .NET CoreOverlay
+ln -sf ../%{netcoreappdir}/System.Private.CoreLib.dll %{buildroot}%{_datadir}/%{tizennetdir}
+ln -sf ../%{netcoreappdir}/SOS.NETCore.dll %{buildroot}%{_datadir}/%{tizennetdir}
+%endif
+
+%if 0%{skipnative}
+%else
+%files
+%manifest %{name}.manifest
+%dir %{_datadir}/%{dotnetdir}
+%dir %{_datadir}/%{netcoreappdir}
+%dir %{_datadir}/%{tizennetdir}
+%{_datadir}/%{netcoreappdir}/corerun
+%{_datadir}/%{netcoreappdir}/*.so
+%{_datadir}/%{tizennetdir}/*
+%{_datadir}/%{tizennetdir}/.clrinfo
+%{_datadir}/%{dotnetdir}/corerun
+
+%files extra
+%manifest %{name}.manifest
+%dir %{_datadir}/%{dotnetfwdir}
+%{_datadir}/%{dotnetfwdir}/*
+
+%files test
+%manifest %{name}.manifest
+%dir %{_datadir}/%{dotnettestdir}
+%{_datadir}/%{dotnettestdir}/*
+
+%files devel
+%manifest %{name}.manifest
+%dir %{_datadir}/%{netcoreappdir}/inc
+%dir %{_datadir}/%{netcoreappdir}/lib
+%dir %{_datadir}/%{netcoreappdir}/src
+%{_datadir}/%{netcoreappdir}/inc/*
+%{_datadir}/%{netcoreappdir}/lib/*
+%{_datadir}/%{netcoreappdir}/src/*
+%endif
+
+%if 0%{skipmscorlib}
+%else
+%files -n mscorlib
+%manifest %{name}.manifest
+%{_datadir}/%{netcoreappdir}/*.dll
+%{_datadir}/%{tizennetdir}/*.dll
+%endif
+
+%changelog
+* Fri Jan 22 2016 MyungJoo Ham <myungjoo.ham@samsung.com> - 0.0.1-1
+- Initial spec file for corerun
diff --git a/packaging/dep_libs.tar.gz b/packaging/dep_libs.tar.gz
new file mode 100644
index 0000000000..4925312774
--- /dev/null
+++ b/packaging/dep_libs.tar.gz
Binary files differ
diff --git a/packaging/downloaded_files.tar.gz b/packaging/downloaded_files.tar.gz
new file mode 100644
index 0000000000..92a301916d
--- /dev/null
+++ b/packaging/downloaded_files.tar.gz
Binary files differ
diff --git a/packaging/libicu.tar.gz b/packaging/libicu.tar.gz
new file mode 100644
index 0000000000..949308e754
--- /dev/null
+++ b/packaging/libicu.tar.gz
Binary files differ
diff --git a/packaging/tizen-toolchain-support.patch b/packaging/tizen-toolchain-support.patch
new file mode 100644
index 0000000000..531bf781c6
--- /dev/null
+++ b/packaging/tizen-toolchain-support.patch
@@ -0,0 +1,49 @@
+From 8f291c286db9813e6c797030707b41872b9616a6 Mon Sep 17 00:00:00 2001
+From: Jiyoung Yun <jy910.yun@samsung.com>
+Date: Fri, 14 Jul 2017 11:58:39 +0900
+Subject: [PATCH] tizen toolchain support
+
+Change-Id: Idb48d26dc1dfff8a6dc758b90bc94cb48963f8a2
+---
+ compileoptions.cmake | 2 +-
+ cross/armel/toolchain.cmake | 9 +--------
+ 2 files changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/compileoptions.cmake b/compileoptions.cmake
+index 75d51fd..4649ea3 100644
+--- a/compileoptions.cmake
++++ b/compileoptions.cmake
+@@ -59,7 +59,7 @@ if(CLR_CMAKE_PLATFORM_UNIX_ARM)
+ if(ARM_SOFTFP)
+ add_definitions(-DARM_SOFTFP)
+ add_compile_options(-mfloat-abi=softfp)
+- add_compile_options(-target armv7-linux-gnueabi)
++ add_compile_options(-target armv7l-tizen-linux-gnueabi)
+ else()
+ add_compile_options(-target armv7-linux-gnueabihf)
+ endif(ARM_SOFTFP)
+diff --git a/cross/armel/toolchain.cmake b/cross/armel/toolchain.cmake
+index 86e2306..84f41f1 100644
+--- a/cross/armel/toolchain.cmake
++++ b/cross/armel/toolchain.cmake
+@@ -16,16 +16,9 @@ set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -target ${TOOLCHAIN}")
+ set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}")
+
+ if("$ENV{__DistroRid}" MATCHES "tizen.*")
+- set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/6.2.1")
+- include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
+- include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi)
++ add_compile_options(-target armv7l-tizen-linux-gnueabi)
+ add_compile_options(-Wno-deprecated-declarations) # compile-time option
+ add_compile_options(-D__extern_always_inline=inline) # compile-time option
+-
+- set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+- set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib")
+- set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/usr/lib")
+- set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+ else()
+ # TODO: this setting assumes debian armel rootfs
+ include_directories(SYSTEM ${CROSS_ROOTFS}/usr/include/c++/4.9)
+--
+1.9.1
+