Bug 1587468 - Update object to 0.16.0 and goblin to 0.1.2. r=emilio
authorMike Hommey <mh+mozilla@glandium.org>
Fri, 06 Dec 2019 00:33:03 +0000
changeset 567930 eef1d8be4e7bd9caf17df8008ed339a6ed478921
parent 567929 62bf422ec70c20a5f8767173f8e52cdcbcbbcb6c
child 567931 c0280f40a19782f3756a6cf57a1a465bbee3d951
push id12493
push userffxbld-merge
push dateMon, 06 Jan 2020 15:38:57 +0000
treeherdermozilla-beta@63ae456b848d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersemilio
bugs1587468
milestone73.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1587468 - Update object to 0.16.0 and goblin to 0.1.2. r=emilio This has the side effect of adding another version of uuid, which we'll upgrade for other dependencies subsequently. Differential Revision: https://phabricator.services.mozilla.com/D55911
Cargo.lock
third_party/rust/goblin/.cargo-checksum.json
third_party/rust/goblin/CHANGELOG.md
third_party/rust/goblin/Cargo.lock
third_party/rust/goblin/Cargo.toml
third_party/rust/goblin/README.md
third_party/rust/goblin/examples/dotnet_pe_analysis.rs
third_party/rust/goblin/src/archive/mod.rs
third_party/rust/goblin/src/elf/compression_header.rs
third_party/rust/goblin/src/elf/dynamic.rs
third_party/rust/goblin/src/elf/gnu_hash.rs
third_party/rust/goblin/src/elf/header.rs
third_party/rust/goblin/src/elf/mod.rs
third_party/rust/goblin/src/elf/note.rs
third_party/rust/goblin/src/elf/program_header.rs
third_party/rust/goblin/src/elf/reloc.rs
third_party/rust/goblin/src/elf/section_header.rs
third_party/rust/goblin/src/elf/sym.rs
third_party/rust/goblin/src/mach/header.rs
third_party/rust/goblin/src/mach/load_command.rs
third_party/rust/goblin/src/mach/segment.rs
third_party/rust/goblin/src/mach/symbols.rs
third_party/rust/goblin/src/pe/debug.rs
third_party/rust/goblin/src/pe/exception.rs
third_party/rust/goblin/src/pe/export.rs
third_party/rust/goblin/src/pe/import.rs
third_party/rust/goblin/src/pe/mod.rs
third_party/rust/goblin/src/pe/optional_header.rs
third_party/rust/goblin/src/pe/section_table.rs
third_party/rust/goblin/src/pe/utils.rs
third_party/rust/goblin/tests/archive.rs
third_party/rust/object/.cargo-checksum.json
third_party/rust/object/Cargo.lock
third_party/rust/object/Cargo.toml
third_party/rust/object/src/common.rs
third_party/rust/object/src/read/any.rs
third_party/rust/object/src/read/coff.rs
third_party/rust/object/src/read/elf.rs
third_party/rust/object/src/read/macho.rs
third_party/rust/object/src/read/pe.rs
third_party/rust/object/src/read/traits.rs
third_party/rust/object/src/read/wasm.rs
third_party/rust/object/src/write/coff.rs
third_party/rust/object/src/write/elf.rs
third_party/rust/object/src/write/macho.rs
third_party/rust/object/src/write/mod.rs
third_party/rust/object/tests/round_trip.rs
third_party/rust/object/tests/tls.rs
third_party/rust/parity-wasm/.cargo-checksum.json
third_party/rust/parity-wasm/Cargo.lock
third_party/rust/parity-wasm/Cargo.toml
third_party/rust/parity-wasm/README.md
third_party/rust/parity-wasm/src/builder/code.rs
third_party/rust/parity-wasm/src/builder/data.rs
third_party/rust/parity-wasm/src/builder/export.rs
third_party/rust/parity-wasm/src/builder/import.rs
third_party/rust/parity-wasm/src/builder/memory.rs
third_party/rust/parity-wasm/src/builder/misc.rs
third_party/rust/parity-wasm/src/builder/module.rs
third_party/rust/parity-wasm/src/builder/table.rs
third_party/rust/parity-wasm/src/elements/export_entry.rs
third_party/rust/parity-wasm/src/elements/func.rs
third_party/rust/parity-wasm/src/elements/import_entry.rs
third_party/rust/parity-wasm/src/elements/index_map.rs
third_party/rust/parity-wasm/src/elements/mod.rs
third_party/rust/parity-wasm/src/elements/module.rs
third_party/rust/parity-wasm/src/elements/name_section.rs
third_party/rust/parity-wasm/src/elements/ops.rs
third_party/rust/parity-wasm/src/elements/primitives.rs
third_party/rust/parity-wasm/src/elements/reloc_section.rs
third_party/rust/parity-wasm/src/elements/section.rs
third_party/rust/parity-wasm/src/elements/segment.rs
third_party/rust/parity-wasm/src/elements/types.rs
third_party/rust/parity-wasm/src/io.rs
third_party/rust/parity-wasm/src/lib.rs
third_party/rust/scroll/.cargo-checksum.json
third_party/rust/scroll/CHANGELOG.md
third_party/rust/scroll/Cargo.lock
third_party/rust/scroll/Cargo.toml
third_party/rust/scroll/README.md
third_party/rust/scroll/benches/bench.rs
third_party/rust/scroll/build.rs
third_party/rust/scroll/examples/data_ctx.rs
third_party/rust/scroll/src/ctx.rs
third_party/rust/scroll/src/endian.rs
third_party/rust/scroll/src/error.rs
third_party/rust/scroll/src/greater.rs
third_party/rust/scroll/src/leb128.rs
third_party/rust/scroll/src/lesser.rs
third_party/rust/scroll/src/lib.rs
third_party/rust/scroll/src/pread.rs
third_party/rust/scroll/src/pwrite.rs
third_party/rust/scroll/tests/api.rs
third_party/rust/scroll/tests/readme.rs
third_party/rust/scroll_derive/.cargo-checksum.json
third_party/rust/scroll_derive/Cargo.lock
third_party/rust/scroll_derive/Cargo.toml
third_party/rust/scroll_derive/examples/main.rs
third_party/rust/scroll_derive/src/lib.rs
third_party/rust/scroll_derive/tests/tests.rs
third_party/rust/target-lexicon-0.8.1/.cargo-checksum.json
third_party/rust/target-lexicon-0.8.1/Cargo.lock
third_party/rust/target-lexicon-0.8.1/Cargo.toml
third_party/rust/target-lexicon-0.8.1/LICENSE
third_party/rust/target-lexicon-0.8.1/README.md
third_party/rust/target-lexicon-0.8.1/build.rs
third_party/rust/target-lexicon-0.8.1/examples/host.rs
third_party/rust/target-lexicon-0.8.1/examples/misc.rs
third_party/rust/target-lexicon-0.8.1/host.rs
third_party/rust/target-lexicon-0.8.1/newlist
third_party/rust/target-lexicon-0.8.1/sorted.txt
third_party/rust/target-lexicon-0.8.1/src/host.rs
third_party/rust/target-lexicon-0.8.1/src/lib.rs
third_party/rust/target-lexicon-0.8.1/src/parse_error.rs
third_party/rust/target-lexicon-0.8.1/src/targets.rs
third_party/rust/target-lexicon-0.8.1/src/triple.rs
third_party/rust/target-lexicon-0.8.1/test.sh
third_party/rust/uuid-0.7.4/.cargo-checksum.json
third_party/rust/uuid-0.7.4/CODEOWNERS
third_party/rust/uuid-0.7.4/CODE_OF_CONDUCT.md
third_party/rust/uuid-0.7.4/CONTRIBUTING.md
third_party/rust/uuid-0.7.4/COPYRIGHT
third_party/rust/uuid-0.7.4/Cargo.toml
third_party/rust/uuid-0.7.4/LICENSE-APACHE
third_party/rust/uuid-0.7.4/LICENSE-MIT
third_party/rust/uuid-0.7.4/README.md
third_party/rust/uuid-0.7.4/README.tpl
third_party/rust/uuid-0.7.4/benches/format_str.rs
third_party/rust/uuid-0.7.4/benches/invalid_parse_str.rs
third_party/rust/uuid-0.7.4/benches/mod.rs
third_party/rust/uuid-0.7.4/benches/serde_support.rs
third_party/rust/uuid-0.7.4/benches/slog_support/mod.rs
third_party/rust/uuid-0.7.4/benches/slog_support/parse_str.rs
third_party/rust/uuid-0.7.4/benches/valid_parse_str.rs
third_party/rust/uuid-0.7.4/src/adapter/compact.rs
third_party/rust/uuid-0.7.4/src/adapter/core_support/mod.rs
third_party/rust/uuid-0.7.4/src/adapter/mod.rs
third_party/rust/uuid-0.7.4/src/builder.rs
third_party/rust/uuid-0.7.4/src/core_support.rs
third_party/rust/uuid-0.7.4/src/lib.rs
third_party/rust/uuid-0.7.4/src/parser/core_support.rs
third_party/rust/uuid-0.7.4/src/parser/mod.rs
third_party/rust/uuid-0.7.4/src/parser/std_support.rs
third_party/rust/uuid-0.7.4/src/prelude.rs
third_party/rust/uuid-0.7.4/src/serde_support.rs
third_party/rust/uuid-0.7.4/src/slog_support.rs
third_party/rust/uuid-0.7.4/src/std_support.rs
third_party/rust/uuid-0.7.4/src/test_util.rs
third_party/rust/uuid-0.7.4/src/u128_support.rs
third_party/rust/uuid-0.7.4/src/v1.rs
third_party/rust/uuid-0.7.4/src/v3.rs
third_party/rust/uuid-0.7.4/src/v4.rs
third_party/rust/uuid-0.7.4/src/v5.rs
third_party/rust/uuid-0.7.4/src/winapi_support.rs
third_party/rust/uuid/.cargo-checksum.json
third_party/rust/uuid/Cargo.toml
third_party/rust/uuid/README.md
third_party/rust/uuid/README.tpl
third_party/rust/uuid/benches/format_str.rs
third_party/rust/uuid/benches/invalid_parse_str.rs
third_party/rust/uuid/benches/mod.rs
third_party/rust/uuid/benches/serde_support.rs
third_party/rust/uuid/benches/slog_support/mod.rs
third_party/rust/uuid/benches/slog_support/parse_str.rs
third_party/rust/uuid/benches/valid_parse_str.rs
third_party/rust/uuid/src/adapter/compact.rs
third_party/rust/uuid/src/adapter/core_support/mod.rs
third_party/rust/uuid/src/adapter/mod.rs
third_party/rust/uuid/src/builder.rs
third_party/rust/uuid/src/builder/error.rs
third_party/rust/uuid/src/builder/mod.rs
third_party/rust/uuid/src/core_support.rs
third_party/rust/uuid/src/error.rs
third_party/rust/uuid/src/lib.rs
third_party/rust/uuid/src/parser/core_support.rs
third_party/rust/uuid/src/parser/error.rs
third_party/rust/uuid/src/parser/mod.rs
third_party/rust/uuid/src/parser/std_support.rs
third_party/rust/uuid/src/prelude.rs
third_party/rust/uuid/src/serde_support.rs
third_party/rust/uuid/src/slog_support.rs
third_party/rust/uuid/src/std_support.rs
third_party/rust/uuid/src/test_util.rs
third_party/rust/uuid/src/u128_support.rs
third_party/rust/uuid/src/v1.rs
third_party/rust/uuid/src/v3.rs
third_party/rust/uuid/src/v4.rs
third_party/rust/uuid/src/v5.rs
third_party/rust/uuid/src/winapi_support.rs
tools/profiler/rust-helper/Cargo.toml
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1505,22 +1505,22 @@ dependencies = [
 
 [[package]]
 name = "glob"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "goblin"
-version = "0.0.24"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "guid_win"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "comedy 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1896,17 +1896,17 @@ version = "0.1.1"
 source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
 dependencies = [
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cranelift-entity 0.41.0 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "object 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "object 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-runtime"
 version = "0.1.1"
 source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
@@ -2551,25 +2551,25 @@ name = "objc_exception"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "object"
-version = "0.14.0"
+version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "flate2 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "parity-wasm 0.40.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "once_cell"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -2631,17 +2631,17 @@ source = "registry+https://github.com/ru
 dependencies = [
  "packed_struct 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "parity-wasm"
-version = "0.40.3"
+version = "0.41.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "parking_lot"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2844,22 +2844,22 @@ dependencies = [
 name = "procedural-masquerade"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "profiler_helper"
 version = "0.1.0"
 dependencies = [
- "goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "object 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "object 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "thin-vec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "pulse"
 version = "0.3.0"
 dependencies = [
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pulse-ffi 0.1.0",
@@ -3247,17 +3247,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "rlbox_lucet_sandbox"
 version = "0.1.0"
 source = "git+https://github.com/PLSysSec/rlbox_lucet_sandbox/?rev=997c648eb0eaeaaa7a00a9eee20431f750b4e190#997c648eb0eaeaaa7a00a9eee20431f750b4e190"
 dependencies = [
  "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-runtime 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-runtime-internals 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-wasi 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
 ]
 
 [[package]]
 name = "ron"
@@ -3353,31 +3353,30 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "scopeguard"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "scroll"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)",
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "scroll_derive"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "selectors"
 version = "0.21.0"
 dependencies = [
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.27.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3803,26 +3802,16 @@ dependencies = [
  "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "target-lexicon"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "target-lexicon"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "tempfile"
 version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -4254,16 +4243,21 @@ source = "registry+https://github.com/ru
 name = "uuid"
 version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "uuid"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "vcpkg"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "vec_map"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4789,17 +4783,17 @@ dependencies = [
 "checksum gfx-backend-dx12 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6e913cc800fb12eaba2c420091a02aca9aafbefd672600dfc5b52654343d341"
 "checksum gfx-backend-empty 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d383e6bc48867cb37d298a20139fd1eec298f8f6d594690cd1c50ef25470cc7"
 "checksum gfx-backend-metal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8de5c71f18ba805c95b84d6c78c472ef44485a6fc46e3b49fe1e6739c8d7b0c0"
 "checksum gfx-backend-vulkan 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62538fedd66a78968a162e8e1a29d085ffbc97f8782634684b2f7da7aea59207"
 "checksum gfx-hal 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "977716fea7800ab5bc9a1e048dd2f72b23af166d8c2f48c6fb6d1ce37d77ca7e"
 "checksum gl_generator 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39a23d5e872a275135d66895d954269cf5e8661d234eb1c2480f4ce0d586acbd"
 "checksum gleam 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7f46fd8874e043ffac0d638ed1567a2584f7814f6d72b4db37ab1689004a26c4"
 "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
-"checksum goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "e3fa261d919c1ae9d1e4533c4a2f99e10938603c4208d56c05bec7a872b661b0"
+"checksum goblin 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88a79ef1f0dad46fd78075b6f80f92d97710eddf87b3e18a15a66761e8942672"
 "checksum guid_win 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87261686cc5e35b6584f4c2a430c2b153d8a92ab1ef820c16be34c1df8f5f58b"
 "checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c"
 "checksum headers 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6e2e51d356081258ef05ff4c648138b5d3fe64b7300aaad3b820554a2b7fb6"
 "checksum headers-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "967131279aaa9f7c20c7205b45a391638a83ab118e6509b2d0ccbe08de044237"
 "checksum headers-derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f33cf300c485e3cbcba0235013fcc768723451c9b84d1b31aa7fec0491ac9a11"
 "checksum hibitset 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47e7292fd9f7fe89fa35c98048f2d0a69b79ed243604234d18f6f8a1aa6f408d"
 "checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a"
 "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83"
@@ -4872,25 +4866,25 @@ dependencies = [
 "checksum num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c8b15b261814f992e33760b1fca9fe8b693d8a65299f20c9901688636cfb746"
 "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
 "checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
 "checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10"
 "checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
 "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "31d20fd2b37e07cf5125be68357b588672e8cefe9a96f8c17a9d46053b3e590d"
 "checksum objc_exception 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
-"checksum object 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81afbc5773e99efe9533d8a539dfac37e531dcd0f4eeb41584bae03ccf76d4c2"
+"checksum object 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a3c61759aa254402e53c79a68dc519cda1ceee2ff2b6d70b3e58bf64ac2f03e3"
 "checksum once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "891f486f630e5c5a4916c7e16c4b24a53e78c860b646e9f8e005e4f16847bfed"
 "checksum opaque-debug 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "51ecbcb821e1bd256d456fe858aaa7f380b63863eab2eb86eee1bd9f33dd6682"
 "checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2"
 "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13"
 "checksum packed_simd 0.3.3 (git+https://github.com/hsivonen/packed_simd?branch=rust_1_32)" = "<none>"
 "checksum packed_struct 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "90caf80e74380d94f2aabc83edb900b49123b3132442fb147f9155c87a756281"
 "checksum packed_struct_codegen 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9f6fda15ebe37b7b28889bd4aa75bb134652eaec9eb99d1bf02f806fca4357fc"
-"checksum parity-wasm 0.40.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1e39faaa292a687ea15120b1ac31899b13586446521df6c149e46f1584671e0f"
+"checksum parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865"
 "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252"
 "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
 "checksum phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
 "checksum phf_codegen 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
 "checksum phf_generator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
 "checksum phf_macros 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
@@ -4955,18 +4949,18 @@ dependencies = [
 "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649"
 "checksum rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7540fc8b0c49f096ee9c961cda096467dce8084bec6bdca2fc83895fd9b28cb8"
 "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
 "checksum ryu 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0568787116e13c652377b6846f5931454a363a8fdf8ae50463ee40935b278b"
 "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9"
 "checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637"
 "checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
 "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
-"checksum scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f84d114ef17fd144153d608fba7c446b0145d038985e7a8cc5d08bb0ce20383"
-"checksum scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb"
+"checksum scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1"
+"checksum scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28"
 "checksum semver 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd61b85a0fa777f7fb7c454b9189b2941b110d1385ce84d7f76efdf1606a85"
 "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
 "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 "checksum serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0"
 "checksum serde_bytes 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "45af0182ff64abaeea290235eb67da3825a576c5d53e642c4d5b652e12e6effc"
 "checksum serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "ca13fc1a832f793322228923fbb3aba9f3f44444898f835d31ad1b74fa0a2bf8"
 "checksum serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "44dd2cfde475037451fa99b7e5df77aa3cfd1536575fa8e7a538ab36dcde49ae"
 "checksum serde_repr 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "cd02c7587ec314570041b2754829f84d873ced14a96d1fd1823531e11db40573"
@@ -4990,17 +4984,16 @@ dependencies = [
 "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970"
 "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
 "checksum svg_fmt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c666f0fed8e1e20e057af770af9077d72f3d5a33157b8537c1475dd8ffd6d32b"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
 "checksum syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)" = "66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2"
 "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
 "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
 "checksum synstructure 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f085a5855930c0441ca1288cf044ea4aecf4f43a91668abdb870b4ba546a203"
-"checksum target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7975cb2c6f37d77b190bc5004a2bb015971464756fde9514651a525ada2a741a"
 "checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4"
 "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
 "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
 "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
 "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
 "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
 "checksum thin-slice 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
 "checksum thin-vec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73fdf4b84c65a85168477b7fb6c498e0716bc9487fba24623389ea7f51708044"
@@ -5038,16 +5031,17 @@ dependencies = [
 "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
 "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
 "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
 "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
 "checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61"
 "checksum urlencoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3df3561629a8bb4c57e5a2e4c43348d9e29c7c29d9b1c4c1f47166deca8f37ed"
 "checksum utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba"
 "checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+"checksum uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
 "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
 "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
 "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "63636bd0eb3d00ccb8b9036381b526efac53caf112b7783b730ab3f8e44da369"
 "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
 "checksum warp 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "33857527c63bc514452f885d0a57019f28139c58fef2b3566016ecc0d44e5d24"
 "checksum wasmparser 0.39.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5083b449454f7de0b15f131eee17de54b5a71dcb9adcf11df2b2f78fad0cd82"
--- a/third_party/rust/goblin/.cargo-checksum.json
+++ b/third_party/rust/goblin/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"CHANGELOG.md":"2687aebcf734e1a8add45fb8b009cccc63d97db7820470a518ff5000634a93e4","Cargo.toml":"d7c562d7144ff9b2a72b0a8488156920ce64ae6cd0763b1ca5d055dd2b40aff1","LICENSE":"036bf6b6d6fd6dd1abda2ff6cdb672a63bdf32c468048720072910f2268a965f","README.md":"5ba373319553c5155cfd9d75a2fc962e17b39872a03a19eab34cc872c82b7a78","etc/crt1.rs":"50667c3066e00f92e038bfa4fe6968f49a31d7c6986e19c7c9e695ad9b836f74","etc/crt132.rs":"e69920ceeab57958a1890979158b57fc43f33c5a135b5798d43664c989c8c686","etc/crt1a.rs":"d158350f72aaf4fecd8501735d2f33a1a226e99bf370c794b90f7e9882c8ca64","examples/ar.rs":"e299cdc8478148b4d20788aa7d9cac04ea9587a405380e2bf889a998e68a1d02","examples/automagic.rs":"f202c7d3c6096a6c883c03d0352a750ad9185811e897046d028dba30aa1dcaf2","examples/dotnet_pe_analysis.rs":"b85ea80e45ac8b3fe9fc6111ab2dee4738878811abad3571192924237d5cd949","examples/dyldinfo.rs":"54b2e04f2f94d5f9c9a8b19cb84f768e339d509472bdcfa317eb9bc3c47caa5f","examples/lipo.rs":"3c2ebe95ac4e38d836f795c65b6e740ae08b751e5ee615bb3feb8620934ca2c9","examples/rdr.rs":"fb1442a6e4678c62983c9a963198a1e67a19169241c43aac840d41192c57a52b","examples/scroll.rs":"2cdb39c29dafd28ed6bfe99cc980480b49fc8e62bef14ab9eb7c45d0d66866d6","src/archive/mod.rs":"8f84e19cbac174b4f34d539755dd87b32b7ef029e5cef667c11b16652664eeef","src/elf/compression_header.rs":"bb6911bccd2d97af8ae721a410f28bc8a2bc6387c412a82909395676cf4a7364","src/elf/constants_header.rs":"cdd0eea9f4617f86f14b57dccf5124ae62376df6efe2bf617f95e4b24c176d1d","src/elf/constants_relocation.rs":"a010071cd2a25ab71e0c7181eb1d9f417daa2d1ec25a09c74bd12ad944892225","src/elf/dynamic.rs":"f2cd1c40257c597058f0ffab7786e7f6d6a18234ccc20e4fb267221ca5fcffce","src/elf/gnu_hash.rs":"718851196316077c270522f4b8e14454af30c364e0ec917f6eb5c2ed6f84f1af","src/elf/header.rs":"27e09865180b20718b30ea57bb60584958c05fdadb626053b0bbc5f733943f4b","src/elf/mod.rs":"e16fcb1c3ef2bcaa2e37168229876a4f085ed420852b93874e8af10694237e73","src/elf/note.rs":"3428ddd17d4ad840ee1f9831ae1913c94b2b82e85d63b45ff7402e3e45200113","src/elf/program_header.rs":"cb14ed59bcf92595ebefaa8752d4449a6f4ec38373ce5709248bd4883690de3c","src/elf/reloc.rs":"5205c33d897de1f8dfad6ba97b597c2a609a78e93fc231508f243ba4eff7ca78","src/elf/section_header.rs":"e379b303869e410060a0f7507bd8cb49dc268105826aae0f92cebb187386b0da","src/elf/sym.rs":"5f50b5eb5c22cc4d53641f8f37106c8c321a08ed90aaedc6e9fa6e1c4175743a","src/error.rs":"308448cc0f6c72f9da0f16ff11c50be98a94f024e86f4607dd6f084374dbaa00","src/lib.rs":"e43e08e9b7cfd0ee8341dd6ed2c718978f3ddab976cab98b5fdadbab315c197c","src/mach/bind_opcodes.rs":"2477021270083fd3d9200adebf5d2a1963b9014c7400be39fb68c8b309e4eebe","src/mach/constants.rs":"36d9011c2db6fac7b561b44350f08e56885fa721329d316e79d1e112e83ebbf5","src/mach/exports.rs":"16910411ca6e13cbe87154b653a9f74ecc3664d198c24b13a6d605ed00901e35","src/mach/fat.rs":"534b01ddeb803217a5e0a8b2bbd7306fd24f5a4ea99f7615714bbeee6b8fb194","src/mach/header.rs":"91d13e0a986933eff9479aafcca46ba2f8fdb042ae6407800e02b3a240b8ae86","src/mach/imports.rs":"d0ecaa49219afa28613759eea0fdf1974d2b91f78502d137a09ccacf4f7c586a","src/mach/load_command.rs":"c04df81c03d1450be4ced724edb48c5b79e78b6c292397bed12e5f7b9109e2b4","src/mach/mod.rs":"9a776bdaf8b5f3f2e8f8a6a658d62266f3233c80c439d1c872334994e40866d1","src/mach/relocation.rs":"9e09da219bd78d9d5caba22a893622b426afa7548472686b7edb7f74aa115eb5","src/mach/segment.rs":"51d1fd608c5ca311c089bc5640daa6f2e6a2a224cca9e2c30d98c72b4b130701","src/mach/symbols.rs":"bd62ce00c94e8c5ce63293404fc51bde3965e2be3015fa0a84632506a4181bd0","src/pe/characteristic.rs":"4fa8a7e6de20795b6d70d80fc25568eb999bb3dd9f9735d1407302a8053b3dd1","src/pe/data_directories.rs":"a5de9ca2b4e23e7644a31554276f5f68eed12c8808617a3e480427cbe5df3504","src/pe/debug.rs":"5a5215f2f341eb476626c2fd457d23f82610b783819ac2667793272ebf78b650","src/pe/exception.rs":"952a4d8380a6f89592707a8c9ff4b152da2a620e53f248d378d6c49134140016","src/pe/export.rs":"720f701057ea92628828ef96f836f5f8024290f017fd9df4e8ef0b4b79ed3eda","src/pe/header.rs":"50c560d0712a2128ed3af6a93f5c7248fbcaa91d1aec58496e3d4446ec51d0ea","src/pe/import.rs":"300502b117279ea5eafea3b1a97a9809ed303bbefcdaed2abd332e4a80142c8e","src/pe/mod.rs":"95fb58479453acd6fae7dfab7d236dee2eeb7d8e9b21abc7e1cf5ccf9486c4a5","src/pe/optional_header.rs":"0d947e997d657f98e4cc737ef3c2cd7e6a4e4e5270a4403b9622ba44d1eda4cd","src/pe/relocation.rs":"c479b80bb1d6910f2168505dda4f2d8925b7edc34bed4e25d069546f88f52bb3","src/pe/section_table.rs":"92eb6ef848b701346181d9c5bd8382114bbcbfef74e67035311310ad1385bee8","src/pe/symbol.rs":"b9ac555f3ad652c39daba17afe9e0474d97ccbb34f24d5f363a9f6dbf483f6a0","src/pe/utils.rs":"624adb9e2baef91e915989ffa29433d09c8d08033b526bae697fe3cec91293ad","src/strtab.rs":"c157ab7b0033d1879ba6c991706dae397b1f202be4087b693d4879d64160ea1a","tests/archive.rs":"8736af2c5b4749067c9aa34ab03a7f063f0f850d77db2619bea4172ab725cee0","tests/compare_dyldinfos.rs":"bd5f3c22a8a7c1563bf23fa12d95868bd630f3ea5ba3ffe659a602de4ec26e39","tests/macho.rs":"4c892dd614646d3bce79c3bbae731e3a8df947ea3082498a3b7b381813d60123"},"package":"e3fa261d919c1ae9d1e4533c4a2f99e10938603c4208d56c05bec7a872b661b0"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"40429580e8d584d3e0c6a207fd6174c323a2fe527ea13fc289c3d3a078c9a813","Cargo.lock":"764aeda5cef59d0aeb05f21665de54159add83aaef4104d4b629711e5bdd0194","Cargo.toml":"e64c2898115cc6255f0da44a6f8ba02664c3e9922cdc4fc6b6755c0d6c012573","LICENSE":"036bf6b6d6fd6dd1abda2ff6cdb672a63bdf32c468048720072910f2268a965f","README.md":"f2fbf86aa968ca84d9b55f22b499750c765b2e6496110a8c1afbc9756f77fab9","etc/crt1.rs":"50667c3066e00f92e038bfa4fe6968f49a31d7c6986e19c7c9e695ad9b836f74","etc/crt132.rs":"e69920ceeab57958a1890979158b57fc43f33c5a135b5798d43664c989c8c686","etc/crt1a.rs":"d158350f72aaf4fecd8501735d2f33a1a226e99bf370c794b90f7e9882c8ca64","examples/ar.rs":"e299cdc8478148b4d20788aa7d9cac04ea9587a405380e2bf889a998e68a1d02","examples/automagic.rs":"f202c7d3c6096a6c883c03d0352a750ad9185811e897046d028dba30aa1dcaf2","examples/dotnet_pe_analysis.rs":"70f541958e4bc5d4eca91018211e4a3e9fe8194931e1ecbeb3a465dfc14694dd","examples/dyldinfo.rs":"54b2e04f2f94d5f9c9a8b19cb84f768e339d509472bdcfa317eb9bc3c47caa5f","examples/lipo.rs":"3c2ebe95ac4e38d836f795c65b6e740ae08b751e5ee615bb3feb8620934ca2c9","examples/rdr.rs":"fb1442a6e4678c62983c9a963198a1e67a19169241c43aac840d41192c57a52b","examples/scroll.rs":"2cdb39c29dafd28ed6bfe99cc980480b49fc8e62bef14ab9eb7c45d0d66866d6","src/archive/mod.rs":"ace6e75bdad542f87b859812b40de4d59ce397122e035ce252c3c2ee9adebe47","src/elf/compression_header.rs":"865343698ad343705ba1643c5e144db913282973c6e7aec52f2b11b5954718b0","src/elf/constants_header.rs":"cdd0eea9f4617f86f14b57dccf5124ae62376df6efe2bf617f95e4b24c176d1d","src/elf/constants_relocation.rs":"a010071cd2a25ab71e0c7181eb1d9f417daa2d1ec25a09c74bd12ad944892225","src/elf/dynamic.rs":"13eb19c0c83c223ef55c1f8b091a1cbecad8980f1e9827ec3e9852a1db32d841","src/elf/gnu_hash.rs":"0f5c9d89735388569fb56090efbdd32e98f76b2e74d9dd35dfc7a61d8af9fe69","src/elf/header.rs":"f333bde9b957dc398631115708337e980490e3f2605c125f83d10157f4e0913d","src/elf/mod.rs":"48b6ae783bbdcee183b441d66d87eeefb127d4b2c6223261aa2d7f6dd7514ec0","src/elf/note.rs":"7e1317893d5eb970cdfee3bd5affb91f959f29401fa8aedf8485f09aba2c9277","src/elf/program_header.rs":"9e36af989e884b691bf298a0176cef757c46c99520482fe1b989e8e529775c94","src/elf/reloc.rs":"7c575c1f9f5677d951111329dfbbc4b8a2dfd0c6f7233f9d224e9f97a9a3dc9d","src/elf/section_header.rs":"7c3c4ec822046dd67be54ca421618497fbc2b501e4275dfb03336e791a7328c3","src/elf/sym.rs":"e0858c5e74cde3eb0d9c59c7bb1d7ff1d2b5b6686ecefa5142ca56cd7ec37f4a","src/error.rs":"308448cc0f6c72f9da0f16ff11c50be98a94f024e86f4607dd6f084374dbaa00","src/lib.rs":"e43e08e9b7cfd0ee8341dd6ed2c718978f3ddab976cab98b5fdadbab315c197c","src/mach/bind_opcodes.rs":"2477021270083fd3d9200adebf5d2a1963b9014c7400be39fb68c8b309e4eebe","src/mach/constants.rs":"36d9011c2db6fac7b561b44350f08e56885fa721329d316e79d1e112e83ebbf5","src/mach/exports.rs":"16910411ca6e13cbe87154b653a9f74ecc3664d198c24b13a6d605ed00901e35","src/mach/fat.rs":"534b01ddeb803217a5e0a8b2bbd7306fd24f5a4ea99f7615714bbeee6b8fb194","src/mach/header.rs":"dc151e6d53c497838bf1e60f0586f6927d33a4d619bd74ce4e44ff6dd78ea5f4","src/mach/imports.rs":"d0ecaa49219afa28613759eea0fdf1974d2b91f78502d137a09ccacf4f7c586a","src/mach/load_command.rs":"ac3c853cf9bb1c7de4f20a9345c0d8a6a73037ceef979a6715a3d6101675a28d","src/mach/mod.rs":"9a776bdaf8b5f3f2e8f8a6a658d62266f3233c80c439d1c872334994e40866d1","src/mach/relocation.rs":"9e09da219bd78d9d5caba22a893622b426afa7548472686b7edb7f74aa115eb5","src/mach/segment.rs":"a38fbc0ffcdc16331730727ea63a291afda96553fe62b5a92d0be6b9b64b8bf8","src/mach/symbols.rs":"80db23a5a0b8e987d192c7a96691e15696d1b417e4a9f81027f88b1b5140a61d","src/pe/characteristic.rs":"4fa8a7e6de20795b6d70d80fc25568eb999bb3dd9f9735d1407302a8053b3dd1","src/pe/data_directories.rs":"a5de9ca2b4e23e7644a31554276f5f68eed12c8808617a3e480427cbe5df3504","src/pe/debug.rs":"4cc117f1f9621fe11fab114c9d827483620efd367035f6dbcf1351571b4ce8fe","src/pe/exception.rs":"1ce70539eb36e3a85b4d6444136881202c9f7e82b524c7b4c33f1885e94500a7","src/pe/export.rs":"247d37e23cc23056dc52b467cabcc0f4845260f1a215bb8ec5e3c20d4cff1935","src/pe/header.rs":"50c560d0712a2128ed3af6a93f5c7248fbcaa91d1aec58496e3d4446ec51d0ea","src/pe/import.rs":"9379bacb0e1931c4bc3a3e1de4d7801e8d47e50a4db9f97eb86c4b6d88bc58c3","src/pe/mod.rs":"5c872ccf74e45f47063296b3aaff91861dbac0338e7a508bed2f214510d4e1f2","src/pe/optional_header.rs":"e329be7081cd7734a7ca2de486303034f179d2c2fd07095476e4f39e475e072a","src/pe/relocation.rs":"c479b80bb1d6910f2168505dda4f2d8925b7edc34bed4e25d069546f88f52bb3","src/pe/section_table.rs":"cd3be25fe5da05440c6873ed50b8b788acbe6377f3777d44c4f5f65d08818b31","src/pe/symbol.rs":"b9ac555f3ad652c39daba17afe9e0474d97ccbb34f24d5f363a9f6dbf483f6a0","src/pe/utils.rs":"6aad2b9ebbf1a7b5b1ad6c535691f35b234e4abff82bd0df16a4c7a2bdc084ee","src/strtab.rs":"c157ab7b0033d1879ba6c991706dae397b1f202be4087b693d4879d64160ea1a","tests/archive.rs":"9a633de16ab12fcb92be0dc237031460a69dbd63cfb59a5a46ba67c872ccc180","tests/compare_dyldinfos.rs":"bd5f3c22a8a7c1563bf23fa12d95868bd630f3ea5ba3ffe659a602de4ec26e39","tests/macho.rs":"4c892dd614646d3bce79c3bbae731e3a8df947ea3082498a3b7b381813d60123"},"package":"88a79ef1f0dad46fd78075b6f80f92d97710eddf87b3e18a15a66761e8942672"}
\ No newline at end of file
--- a/third_party/rust/goblin/CHANGELOG.md
+++ b/third_party/rust/goblin/CHANGELOG.md
@@ -1,14 +1,32 @@
 # Changelog
 All notable changes to this project will be documented in this file.
 
 Before 1.0, this project does not adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
-I'm sorry, I will try my best to ease breaking changes.  We're almost to 1.0, don't worry!
+Goblin is now 0.1, which means we will try our best to ease breaking changes. Tracking issue is here: https://github.com/m4b/goblin/issues/97
+
+## [0.1.2] - 2019-12-02
+### Fixed
+mach: don't return data for zerofill sections, @philipc https://github.com/m4b/goblin/pull/195
+
+## [0.1.1] - 2019-11-10
+### Fixed
+elf: Don't fail entire elf parse when interpreter is malformed string, @jsgf https://github.com/m4b/goblin/pull/192
+
+## [0.1.0] - 2019-11-3
+### Added
+- update to scroll 0.10 api
+### Changed
+- BREAKING: rename export to lib in Reexport::DLLOrdinal from @lzybkr
+- pe: only parse ExceptionData for machine X86_64, thanks @wyxloading
+### Fixed
+pe: Fix resolution of redirect unwind info, thanks @jan-auer https://github.com/m4b/goblin/pull/183
+pe: fix reexport dll and ordinal, thanks @lzybkr: d62889f469846af0cceb789b415f1e14f5f9e402
 
 ## [0.0.24] - 2019-7-13
 ### Added
 - archive: new public enum type to determine which kind of archive was parsed
 ### Fixed
 - archive: thanks @raindev
     * fix parsing of windows style archives: https://github.com/m4b/goblin/pull/174
     * stricter parsing of archives with multiple indexes: https://github.com/m4b/goblin/pull/175
new file mode 100644
--- /dev/null
+++ b/third_party/rust/goblin/Cargo.lock
@@ -0,0 +1,88 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "goblin"
+version = "0.1.2"
+dependencies = [
+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "log"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "plain"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "scroll"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+"checksum plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1"
+"checksum scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28"
+"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
--- a/third_party/rust/goblin/Cargo.toml
+++ b/third_party/rust/goblin/Cargo.toml
@@ -8,17 +8,17 @@
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 edition = "2018"
 name = "goblin"
-version = "0.0.24"
+version = "0.1.2"
 authors = ["m4b <m4b.github.io@gmail.com>", "seu <seu@panopticon.re>", "Will Glynn <will@willglynn.com>", "Philip Craig <philipjcraig@gmail.com>"]
 include = ["src/**/*", "Cargo.toml", "CHANGELOG.md", "LICENSE", "README.md", "etc/*", "examples/*", "tests/*", "fuzz/**/*"]
 description = "An impish, cross-platform, ELF, Mach-o, and PE binary parsing and loading crate"
 documentation = "https://docs.rs/goblin"
 readme = "README.md"
 keywords = ["binary", "elf", "mach", "pe", "archive"]
 categories = ["parsing", "development-tools::debugging"]
 license = "MIT"
@@ -27,17 +27,17 @@ repository = "https://github.com/m4b/gob
 version = "0.4"
 optional = true
 default-features = false
 
 [dependencies.plain]
 version = "0.2.3"
 
 [dependencies.scroll]
-version = "0.9"
+version = "0.10"
 default_features = false
 
 [features]
 alloc = ["scroll/derive", "log"]
 archive = ["alloc"]
 default = ["std", "elf32", "elf64", "mach32", "mach64", "pe32", "pe64", "archive", "endian_fd"]
 elf32 = []
 elf64 = []
--- a/third_party/rust/goblin/README.md
+++ b/third_party/rust/goblin/README.md
@@ -18,17 +18,17 @@ https://docs.rs/goblin/
 ### Usage
 
 Goblin requires `rustc` 1.31.1.
 
 Add to your `Cargo.toml`
 
 ```toml
 [dependencies]
-goblin = "0.0.24"
+goblin = "0.1"
 ```
 
 ### Features
 
 * awesome crate name
 * zero-copy, cross-platform, endian-aware, ELF64/32 implementation - wow!
 * zero-copy, cross-platform, endian-aware, 32/64 bit Mach-o parser - zoiks!
 * PE 32/64-bit parser - bing!
@@ -94,74 +94,81 @@ 1. Write a [bin2json] tool, because why 
 * archive - a Unix Archive parser
 * endian_fd - parses according to the endianness in the binary
 * std - to allow `no_std` environments
 
 # Contributors
 
 Thank you all :heart: !
 
-In alphabetic order:
+In lexicographic order:
 
 - [@amanieu]
 - [@burjui]
 - [@flanfly]
 - [@ibabushkin]
 - [@jan-auer]
 - [@jdub]
 - [@jrmuizel]
+- [@jsgf]
 - [@kjempelodott]
 - [@le-jzr]
 - [@lion128]
 - [@llogiq]
 - [@lzutao]
+- [@lzybkr]
+- [@m4b]
 - [@mitsuhiko]
 - [@mre]
 - [@pchickey]
 - [@philipc]
 - [@Pzixel]
 - [@raindev]
 - [@rocallahan]
 - [@sanxiyn]
 - [@tathanhdinh]
 - [@Techno-coder]
 - [@ticki]
 - [@wickerwacka]
 - [@willglynn]
+- [@wyxloading]
 - [@xcoldhandsx]
 
 <!-- Contributors -->
 
-[@m4b]: https://github.com/m4b
 [@amanieu]: https://github.com/amanieu
+[@burjui]: https://github.com/burjui
 [@flanfly]: https://github.com/flanfly
 [@ibabushkin]: https://github.com/ibabushkin
 [@jan-auer]: https://github.com/jan-auer
 [@jdub]: https://github.com/jdub
 [@jrmuizel]: https://github.com/jrmuizel
+[@jsgf]: https://github.com/jsgf
 [@kjempelodott]: https://github.com/kjempelodott
 [@le-jzr]: https://github.com/le-jzr
 [@lion128]: https://github.com/lion128
 [@llogiq]: https://github.com/llogiq
+[@lzutao]: https://github.com/lzutao
+[@lzybkr]: https://github.com/lzybkr
+[@m4b]: https://github.com/m4b
 [@mitsuhiko]: https://github.com/mitsuhiko
 [@mre]: https://github.com/mre
 [@pchickey]: https://github.com/pchickey
 [@philipc]: https://github.com/philipc
 [@Pzixel]: https://github.com/Pzixel
+[@raindev]: https://github.com/raindev
 [@rocallahan]: https://github.com/rocallahan
 [@sanxiyn]: https://github.com/sanxiyn
 [@tathanhdinh]: https://github.com/tathanhdinh
 [@Techno-coder]: https://github.com/Techno-coder
 [@ticki]: https://github.com/ticki
+[@wickerwacka]: https://github.com/wickerwaka
 [@willglynn]: https://github.com/willglynn
+[@wyxloading]: https://github.com/wyxloading
 [@xcoldhandsx]: https://github.com/xcoldhandsx
-[@lzutao]: https://github.com/lzutao
-[@wickerwacka]: https://github.com/wickerwaka
-[@raindev]: https://github.com/raindev
-[@burjui]: https://github.com/burjui
 
 ## Contributing
 
 1. Please prefix commits with the affected binary component; the more specific the better, e.g.,
    if you only modify relocations in the elf module, then do "elf.reloc: added new constants for Z80"
 1. Commit messages must explain their change, no generic "changed", or "fix"; if you push commits
    like this on a PR, be aware [@m4b] or someone will most likely squash them.
 1. If you are making a large change to a module, please raise an issue first and lets discuss;
--- a/third_party/rust/goblin/examples/dotnet_pe_analysis.rs
+++ b/third_party/rust/goblin/examples/dotnet_pe_analysis.rs
@@ -26,19 +26,17 @@ struct MetadataRoot<'a> {
     pub minor_version: u16,
     _reserved: u32,
     pub length: u32,
     pub version: &'a str,
 }
 
 impl<'a> TryFromCtx<'a, Endian> for MetadataRoot<'a> {
     type Error = scroll::Error;
-    type Size = usize;
-
-    fn try_from_ctx(src: &'a [u8], endian: Endian) -> Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], endian: Endian) -> Result<(Self, usize), Self::Error> {
         let offset = &mut 0;
         let signature = src.gread_with(offset, endian)?;
         let major_version = src.gread_with(offset, endian)?;
         let minor_version = src.gread_with(offset, endian)?;
         let reserved = src.gread_with(offset, endian)?;
         let length = src.gread_with(offset, endian)?;
         let version = src.gread(offset)?;
         Ok((
--- a/third_party/rust/goblin/src/archive/mod.rs
+++ b/third_party/rust/goblin/src/archive/mod.rs
@@ -459,17 +459,18 @@ impl<'a> Archive<'a> {
 
             // build a hashmap translating archive offset into member index
             member_index_by_offset.insert(member.header_offset as u32, i);
         }
 
         // build the symbol index, translating symbol names into member indexes
         let mut symbol_index: BTreeMap<&str, usize> = BTreeMap::new();
         for (member_offset, name) in index.symbol_indexes.iter().zip(index.strtab.iter()) {
-            let member_index = member_index_by_offset[member_offset];
+            let member_index = *member_index_by_offset.get(member_offset)
+		.ok_or(Error::Malformed(format!("Could not get member {:?} at offset: {}", name, member_offset)))?;
             symbol_index.insert(&name, member_index);
         }
 
         Ok(Archive {
             index,
             member_array,
             sysv_name_index,
             members,
--- a/third_party/rust/goblin/src/elf/compression_header.rs
+++ b/third_party/rust/goblin/src/elf/compression_header.rs
@@ -208,50 +208,47 @@ if_alloc! {
                 .field("ch_type", &self.ch_type)
                 .field("ch_size", &format_args!("0x{:x}", self.ch_size))
                 .field("ch_addralign", &format_args!("0x{:x}", self.ch_addralign))
                 .finish()
         }
     }
 
     impl ctx::SizeWith<Ctx> for CompressionHeader {
-        type Units = usize;
-        fn size_with( &Ctx { container, .. }: &Ctx) -> Self::Units {
+        fn size_with( &Ctx { container, .. }: &Ctx) -> usize {
             match container {
                 Container::Little => {
                     compression_header32::SIZEOF_CHDR
                 },
                 Container::Big => {
                     compression_header64::SIZEOF_CHDR
                 },
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, Ctx> for CompressionHeader {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], Ctx {container, le}: Ctx) -> result::Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], Ctx {container, le}: Ctx) -> result::Result<(Self, usize), Self::Error> {
             use scroll::Pread;
             let res = match container {
                 Container::Little => {
                     (bytes.pread_with::<compression_header32::CompressionHeader>(0, le)?.into(), compression_header32::SIZEOF_CHDR)
                 },
                 Container::Big => {
                     (bytes.pread_with::<compression_header64::CompressionHeader>(0, le)?.into(), compression_header64::SIZEOF_CHDR)
                 }
             };
             Ok(res)
         }
     }
 
     impl ctx::TryIntoCtx<Ctx> for CompressionHeader {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<usize, Self::Error> {
             use scroll::Pwrite;
             match container {
                 Container::Little => {
                     let chdr: compression_header32::CompressionHeader = self.into();
                     Ok(bytes.pwrite_with(chdr, 0, le)?)
                 },
                 Container::Big => {
                     let chdr: compression_header64::CompressionHeader = self.into();
--- a/third_party/rust/goblin/src/elf/dynamic.rs
+++ b/third_party/rust/goblin/src/elf/dynamic.rs
@@ -1,27 +1,30 @@
-
 macro_rules! elf_dyn {
     ($size:ty) => {
-        #[cfg(feature = "alloc")]
-        use scroll::{Pread, Pwrite, SizeWith};
+        // XXX: Do not import scroll traits here.
+        // See: https://github.com/rust-lang/rust/issues/65090#issuecomment-538668155
+
         #[repr(C)]
         #[derive(Copy, Clone, PartialEq, Default)]
-        #[cfg_attr(feature = "alloc", derive(Pread, Pwrite, SizeWith))]
+        #[cfg_attr(
+            feature = "alloc",
+            derive(scroll::Pread, scroll::Pwrite, scroll::SizeWith)
+        )]
         /// An entry in the dynamic array
         pub struct Dyn {
             /// Dynamic entry type
             pub d_tag: $size,
             /// Integer value
             pub d_val: $size,
         }
 
         use plain;
         unsafe impl plain::Plain for Dyn {}
-    }
+    };
 }
 
 // TODO: figure out what's the best, most friendly + safe API choice here - u32s or u64s
 // remember that DT_TAG is "pointer sized"/used as address sometimes Original rationale: I
 // decided to use u64 instead of u32 due to pattern matching use case seems safer to cast the
 // elf32's d_tag from u32 -> u64 at runtime instead of casting the elf64's d_tag from u64 ->
 // u32 at runtime
 
@@ -300,50 +303,47 @@ if_alloc! {
             f.debug_struct("Dyn")
                 .field("d_tag", &tag_to_str(self.d_tag))
                 .field("d_val", &format_args!("0x{:x}", self.d_val))
                 .finish()
         }
     }
 
     impl ctx::SizeWith<Ctx> for Dyn {
-        type Units = usize;
         fn size_with(&Ctx { container, .. }: &Ctx) -> usize {
             match container {
                 Container::Little => {
                     dyn32::SIZEOF_DYN
                 },
                 Container::Big => {
                     dyn64::SIZEOF_DYN
                 },
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, Ctx> for Dyn {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], Ctx { container, le}: Ctx) -> result::Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], Ctx { container, le}: Ctx) -> result::Result<(Self, usize), Self::Error> {
             use scroll::Pread;
             let dynamic = match container {
                 Container::Little => {
                     (bytes.pread_with::<dyn32::Dyn>(0, le)?.into(), dyn32::SIZEOF_DYN)
                 },
                 Container::Big => {
                     (bytes.pread_with::<dyn64::Dyn>(0, le)?.into(), dyn64::SIZEOF_DYN)
                 }
             };
             Ok(dynamic)
         }
     }
 
     impl ctx::TryIntoCtx<Ctx> for Dyn {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_into_ctx(self, bytes: &mut [u8], Ctx { container, le}: Ctx) -> result::Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], Ctx { container, le}: Ctx) -> result::Result<usize, Self::Error> {
             use scroll::Pwrite;
             match container {
                 Container::Little => {
                     let dynamic: dyn32::Dyn = self.into();
                     Ok(bytes.pwrite_with(dynamic, 0, le)?)
                 },
                 Container::Big => {
                     let dynamic: dyn64::Dyn = self.into();
--- a/third_party/rust/goblin/src/elf/gnu_hash.rs
+++ b/third_party/rust/goblin/src/elf/gnu_hash.rs
@@ -26,21 +26,21 @@ pub fn hash(symbol: &str) -> u32 {
     hash
 }
 
 #[cfg(test)]
 mod tests {
     use super::hash;
     #[test]
     fn test_hash() {
-        assert_eq!(hash("")             , 0x00001505);
-        assert_eq!(hash("printf")       , 0x156b2bb8);
-        assert_eq!(hash("exit")         , 0x7c967e3f);
-        assert_eq!(hash("syscall")      , 0xbac212a0);
-        assert_eq!(hash("flapenguin.me"), 0x8ae9f18e);
+        assert_eq!(hash("")             , 0x0000_1505);
+        assert_eq!(hash("printf")       , 0x156b_2bb8);
+        assert_eq!(hash("exit")         , 0x7c96_7e3f);
+        assert_eq!(hash("syscall")      , 0xbac2_12a0);
+        assert_eq!(hash("flapenguin.me"), 0x8ae9_f18e);
     }
 }
 
 macro_rules! elf_gnu_hash_impl {
     ($size:ty) => {
 
         use core::slice;
         use core::mem;
--- a/third_party/rust/goblin/src/elf/header.rs
+++ b/third_party/rust/goblin/src/elf/header.rs
@@ -271,33 +271,31 @@ if_alloc! {
                .field("e_shentsize", &self.e_shentsize)
                .field("e_shnum", &self.e_shnum)
                .field("e_shstrndx", &self.e_shstrndx)
                .finish()
         }
     }
 
     impl ctx::SizeWith<crate::container::Ctx> for Header {
-        type Units = usize;
         fn size_with(ctx: &crate::container::Ctx) -> usize {
             match ctx.container {
                 Container::Little => {
                     header32::SIZEOF_EHDR
                 },
                 Container::Big => {
                     header64::SIZEOF_EHDR
                 },
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, scroll::Endian> for Header {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], _ctx: scroll::Endian) -> error::Result<(Self, Self::Size)> {
+        fn try_from_ctx(bytes: &'a [u8], _ctx: scroll::Endian) -> error::Result<(Self, usize)> {
             use scroll::Pread;
             if bytes.len() < SIZEOF_IDENT {
                 return Err(error::Error::Malformed("Too small".to_string()));
             }
             let ident: &[u8] = &bytes[..SIZEOF_IDENT];
             if &ident[0..SELFMAG] != ELFMAG {
                 let magic: u64 = ident.pread_with(0, scroll::LE)?;
                 return Err(error::Error::BadMagic(magic));
@@ -312,21 +310,19 @@ if_alloc! {
                 },
                 _ => {
                     Err(error::Error::Malformed(format!("invalid ELF class {:x}", class)))
                 }
             }
         }
     }
 
-    // TODO: i think we should remove this forcing of the information in the header, it causes too many conflicts
     impl ctx::TryIntoCtx<scroll::Endian> for Header {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_into_ctx(self, bytes: &mut [u8], _ctx: scroll::Endian) -> Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], _ctx: scroll::Endian) -> Result<usize, Self::Error> {
             use scroll::Pwrite;
             match self.container()? {
                 Container::Little => {
                     bytes.pwrite(header32::Header::from(self), 0)
                 },
                 Container::Big => {
                     bytes.pwrite(header64::Header::from(self), 0)
                 }
@@ -405,18 +401,17 @@ macro_rules! elf_header_std_impl {
                         e_shnum: eh.e_shnum,
                         e_shstrndx: eh.e_shstrndx,
                     }
                 }
             }
 
             impl<'a> ctx::TryFromCtx<'a, scroll::Endian> for Header {
                 type Error = crate::error::Error;
-                type Size = usize;
-                fn try_from_ctx(bytes: &'a [u8], _: scroll::Endian) -> result::Result<(Self, Self::Size), Self::Error> {
+                fn try_from_ctx(bytes: &'a [u8], _: scroll::Endian) -> result::Result<(Self, usize), Self::Error> {
                     let mut elf_header = Header::default();
                     let offset = &mut 0;
                     bytes.gread_inout(offset, &mut elf_header.e_ident)?;
                     let endianness =
                         match elf_header.e_ident[EI_DATA] {
                             ELFDATA2LSB => scroll::LE,
                             ELFDATA2MSB => scroll::BE,
                             d => return Err(Error::Malformed(format!("invalid ELF endianness DATA type {:x}", d)).into()),
@@ -435,19 +430,18 @@ macro_rules! elf_header_std_impl {
                     elf_header.e_shnum =     bytes.gread_with(offset, endianness)?;
                     elf_header.e_shstrndx =  bytes.gread_with(offset, endianness)?;
                     Ok((elf_header, SIZEOF_EHDR))
                 }
             }
 
             impl ctx::TryIntoCtx<scroll::Endian> for Header {
                 type Error = crate::error::Error;
-                type Size = usize;
                 /// a Pwrite impl for Header: **note** we use the endianness value in the header, and not a parameter
-                fn try_into_ctx(self, bytes: &mut [u8], _endianness: scroll::Endian) -> result::Result<Self::Size, Self::Error> {
+                fn try_into_ctx(self, bytes: &mut [u8], _endianness: scroll::Endian) -> result::Result<usize, Self::Error> {
                     use scroll::{Pwrite};
                     let offset = &mut 0;
                     let endianness =
                         match self.e_ident[EI_DATA] {
                             ELFDATA2LSB => scroll::LE,
                             ELFDATA2MSB => scroll::BE,
                             d => return Err(Error::Malformed(format!("invalid ELF DATA type {:x}", d)).into()),
                         };
--- a/third_party/rust/goblin/src/elf/mod.rs
+++ b/third_party/rust/goblin/src/elf/mod.rs
@@ -220,17 +220,17 @@ if_sylvan! {
 
             let program_headers = ProgramHeader::parse(bytes, header.e_phoff as usize, header.e_phnum as usize, ctx)?;
 
             let mut interpreter = None;
             for ph in &program_headers {
                 if ph.p_type == program_header::PT_INTERP && ph.p_filesz != 0 {
                     let count = (ph.p_filesz - 1) as usize;
                     let offset = ph.p_offset as usize;
-                    interpreter = Some(bytes.pread_with::<&str>(offset, ::scroll::ctx::StrCtx::Length(count))?);
+                    interpreter = bytes.pread_with::<&str>(offset, ::scroll::ctx::StrCtx::Length(count)).ok();
                 }
             }
 
             let section_headers = SectionHeader::parse(bytes, header.e_shoff as usize, header.e_shnum as usize, ctx)?;
 
             let get_strtab = |section_headers: &[SectionHeader], section_idx: usize| {
                 if section_idx >= section_headers.len() {
                     // FIXME: warn! here
@@ -334,18 +334,17 @@ if_sylvan! {
                 little_endian: is_lsb,
                 ctx,
             })
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, (usize, Endian)> for Elf<'a> {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(src: &'a [u8], (_, _): (usize, Endian)) -> Result<(Elf<'a>, Self::Size), Self::Error> {
+        fn try_from_ctx(src: &'a [u8], (_, _): (usize, Endian)) -> Result<(Elf<'a>, usize), Self::Error> {
             let elf = Elf::parse(src)?;
             Ok((elf, src.len()))
         }
     }
 
     fn gnu_hash_len(bytes: &[u8], offset: usize, ctx: Ctx) -> error::Result<usize> {
         let buckets_num = bytes.pread_with::<u32>(offset, ctx.le)? as usize;
         let min_chain = bytes.pread_with::<u32>(offset + 4, ctx.le)? as usize;
--- a/third_party/rust/goblin/src/elf/note.rs
+++ b/third_party/rust/goblin/src/elf/note.rs
@@ -174,18 +174,17 @@ if_alloc! {
                 NT_GNU_GOLD_VERSION => "NT_GNU_GOLD_VERSION",
                 _ => "NT_UNKNOWN"
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, (usize, container::Ctx)> for Note<'a> {
         type Error = error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], (alignment, ctx): (usize, container::Ctx)) -> Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], (alignment, ctx): (usize, container::Ctx)) -> Result<(Self, usize), Self::Error> {
             let offset = &mut 0;
             let mut alignment = alignment;
             if alignment < 4 {
                 alignment = 4;
             }
             let header: NoteHeader = {
                 match alignment {
                     4|8 => bytes.gread_with::<Nhdr32>(offset, ctx.le)?.into(),
--- a/third_party/rust/goblin/src/elf/program_header.rs
+++ b/third_party/rust/goblin/src/elf/program_header.rs
@@ -174,50 +174,47 @@ if_alloc! {
                 .field("p_filesz", &format_args!("0x{:x}", self.p_filesz))
                 .field("p_memsz", &format_args!("0x{:x}", self.p_memsz))
                 .field("p_align", &self.p_align)
                 .finish()
         }
     }
 
     impl ctx::SizeWith<Ctx> for ProgramHeader {
-        type Units = usize;
         fn size_with(ctx: &Ctx) -> usize {
             match ctx.container {
                 Container::Little => {
                     program_header32::SIZEOF_PHDR
                 },
                 Container::Big => {
                     program_header64::SIZEOF_PHDR
                 },
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, Ctx> for ProgramHeader {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], Ctx { container, le}: Ctx) -> result::Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], Ctx { container, le}: Ctx) -> result::Result<(Self, usize), Self::Error> {
             use scroll::Pread;
             let res = match container {
                 Container::Little => {
                     (bytes.pread_with::<program_header32::ProgramHeader>(0, le)?.into(), program_header32::SIZEOF_PHDR)
                 },
                 Container::Big => {
                     (bytes.pread_with::<program_header64::ProgramHeader>(0, le)?.into(), program_header64::SIZEOF_PHDR)
                 }
             };
             Ok(res)
         }
     }
 
     impl ctx::TryIntoCtx<Ctx> for ProgramHeader {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<usize, Self::Error> {
             use scroll::Pwrite;
             match container {
                 Container::Little => {
                     let phdr: program_header32::ProgramHeader = self.into();
                     Ok(bytes.pwrite_with(phdr, 0, le)?)
                 },
                 Container::Big => {
                     let phdr: program_header64::ProgramHeader = self.into();
--- a/third_party/rust/goblin/src/elf/reloc.rs
+++ b/third_party/rust/goblin/src/elf/reloc.rs
@@ -303,33 +303,31 @@ if_alloc! {
             use scroll::ctx::SizeWith;
             Reloc::size_with(&(is_rela, ctx))
         }
     }
 
     type RelocCtx = (bool, Ctx);
 
     impl ctx::SizeWith<RelocCtx> for Reloc {
-        type Units = usize;
-        fn size_with( &(is_rela, Ctx { container, .. }): &RelocCtx) -> Self::Units {
+        fn size_with( &(is_rela, Ctx { container, .. }): &RelocCtx) -> usize {
             match container {
                 Container::Little => {
                     if is_rela { reloc32::SIZEOF_RELA } else { reloc32::SIZEOF_REL }
                 },
                 Container::Big => {
                     if is_rela { reloc64::SIZEOF_RELA } else { reloc64::SIZEOF_REL }
                 }
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, RelocCtx> for Reloc {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], (is_rela, Ctx { container, le }): RelocCtx) -> result::Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], (is_rela, Ctx { container, le }): RelocCtx) -> result::Result<(Self, usize), Self::Error> {
             use scroll::Pread;
             let reloc = match container {
                 Container::Little => {
                     if is_rela {
                         (bytes.pread_with::<reloc32::Rela>(0, le)?.into(), reloc32::SIZEOF_RELA)
                     } else {
                         (bytes.pread_with::<reloc32::Rel>(0, le)?.into(), reloc32::SIZEOF_REL)
                     }
@@ -343,20 +341,18 @@ if_alloc! {
                 }
             };
             Ok(reloc)
         }
     }
 
     impl ctx::TryIntoCtx<RelocCtx> for Reloc {
         type Error = crate::error::Error;
-        type Size = usize;
-        // TODO: I think this is a bad idea
         /// Writes the relocation into `bytes`
-        fn try_into_ctx(self, bytes: &mut [u8], (is_rela, Ctx {container, le}): RelocCtx) -> result::Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], (is_rela, Ctx {container, le}): RelocCtx) -> result::Result<usize, Self::Error> {
             use scroll::Pwrite;
             match container {
                 Container::Little => {
                     if is_rela {
                         let rela: reloc32::Rela = self.into();
                         Ok(bytes.pwrite_with(rela, 0, le)?)
                     } else {
                         let rel: reloc32::Rel = self.into();
--- a/third_party/rust/goblin/src/elf/section_header.rs
+++ b/third_party/rust/goblin/src/elf/section_header.rs
@@ -1,15 +1,19 @@
 macro_rules! elf_section_header {
     ($size:ident) => {
-        #[cfg(feature = "alloc")]
-        use scroll::{Pread, Pwrite, SizeWith};
+        // XXX: Do not import scroll traits here.
+        // See: https://github.com/rust-lang/rust/issues/65090#issuecomment-538668155
+
         #[repr(C)]
         #[derive(Copy, Clone, Eq, PartialEq, Default)]
-        #[cfg_attr(feature = "alloc", derive(Pread, Pwrite, SizeWith))]
+        #[cfg_attr(
+            feature = "alloc",
+            derive(scroll::Pread, scroll::Pwrite, scroll::SizeWith)
+        )]
         /// Section Headers are typically used by humans and static linkers for additional information or how to relocate the object
         ///
         /// **NOTE** section headers are strippable from a binary without any loss of portability/executability; _do not_ rely on them being there!
         pub struct SectionHeader {
             /// Section name (string tbl index)
             pub sh_name: u32,
             /// Section type
             pub sh_type: u32,
@@ -46,17 +50,17 @@ macro_rules! elf_section_header {
                     .field("sh_size", &format_args!("0x{:x}", self.sh_size))
                     .field("sh_link", &format_args!("0x{:x}", self.sh_link))
                     .field("sh_info", &format_args!("0x{:x}", self.sh_info))
                     .field("sh_addralign", &format_args!("0x{:x}", self.sh_addralign))
                     .field("sh_entsize", &format_args!("0x{:x}", self.sh_entsize))
                     .finish()
             }
         }
-    }
+    };
 }
 
 /// Undefined section.
 pub const SHN_UNDEF: u32 = 0;
 /// Start of reserved indices.
 pub const SHN_LORESERVE: u32 = 0xff00;
 /// Start of processor-specific.
 pub const SHN_LOPROC: u32 = 0xff00;
@@ -485,50 +489,47 @@ if_alloc! {
                 .field("sh_info", &format_args!("0x{:x}", self.sh_info))
                 .field("sh_addralign", &format_args!("0x{:x}", self.sh_addralign))
                 .field("sh_entsize", &format_args!("0x{:x}", self.sh_entsize))
                 .finish()
         }
     }
 
     impl ctx::SizeWith<Ctx> for SectionHeader {
-        type Units = usize;
-        fn size_with( &Ctx { container, .. }: &Ctx) -> Self::Units {
+        fn size_with( &Ctx { container, .. }: &Ctx) -> usize {
             match container {
                 Container::Little => {
                     section_header32::SIZEOF_SHDR
                 },
                 Container::Big => {
                     section_header64::SIZEOF_SHDR
                 },
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, Ctx> for SectionHeader {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_from_ctx(bytes: &'a [u8], Ctx {container, le}: Ctx) -> result::Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], Ctx {container, le}: Ctx) -> result::Result<(Self, usize), Self::Error> {
             use scroll::Pread;
             let res = match container {
                 Container::Little => {
                     (bytes.pread_with::<section_header32::SectionHeader>(0, le)?.into(), section_header32::SIZEOF_SHDR)
                 },
                 Container::Big => {
                     (bytes.pread_with::<section_header64::SectionHeader>(0, le)?.into(), section_header64::SIZEOF_SHDR)
                 }
             };
             Ok(res)
         }
     }
 
     impl ctx::TryIntoCtx<Ctx> for SectionHeader {
         type Error = crate::error::Error;
-        type Size = usize;
-        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<usize, Self::Error> {
             use scroll::Pwrite;
             match container {
                 Container::Little => {
                     let shdr: section_header32::SectionHeader = self.into();
                     Ok(bytes.pwrite_with(shdr, 0, le)?)
                 },
                 Container::Big => {
                     let shdr: section_header64::SectionHeader = self.into();
--- a/third_party/rust/goblin/src/elf/sym.rs
+++ b/third_party/rust/goblin/src/elf/sym.rs
@@ -403,53 +403,50 @@ if_alloc! {
                 .field("st_shndx", &self.st_shndx)
                 .field("st_value", &format_args!("0x{:x}", self.st_value))
                 .field("st_size", &self.st_size)
                 .finish()
         }
     }
 
     impl ctx::SizeWith<Ctx> for Sym {
-        type Units = usize;
         #[inline]
         fn size_with(&Ctx {container, .. }: &Ctx) -> usize {
             match container {
                 Container::Little => {
                     sym32::SIZEOF_SYM
                 },
                 Container::Big => {
                     sym64::SIZEOF_SYM
                 },
             }
         }
     }
 
     impl<'a> ctx::TryFromCtx<'a, Ctx> for Sym {
         type Error = crate::error::Error;
-        type Size = usize;
         #[inline]
-        fn try_from_ctx(bytes: &'a [u8], Ctx { container, le}: Ctx) -> result::Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(bytes: &'a [u8], Ctx { container, le}: Ctx) -> result::Result<(Self, usize), Self::Error> {
             use scroll::Pread;
             let sym = match container {
                 Container::Little => {
                     (bytes.pread_with::<sym32::Sym>(0, le)?.into(), sym32::SIZEOF_SYM)
                 },
                 Container::Big => {
                     (bytes.pread_with::<sym64::Sym>(0, le)?.into(), sym64::SIZEOF_SYM)
                 }
             };
             Ok(sym)
         }
     }
 
     impl ctx::TryIntoCtx<Ctx> for Sym {
         type Error = crate::error::Error;
-        type Size = usize;
         #[inline]
-        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, bytes: &mut [u8], Ctx {container, le}: Ctx) -> result::Result<usize, Self::Error> {
             use scroll::Pwrite;
             match container {
                 Container::Little => {
                     let sym: sym32::Sym = self.into();
                     Ok(bytes.pwrite_with(sym, 0, le)?)
                 },
                 Container::Big => {
                     let sym: sym64::Sym = self.into();
--- a/third_party/rust/goblin/src/mach/header.rs
+++ b/third_party/rust/goblin/src/mach/header.rs
@@ -336,47 +336,44 @@ impl Header {
     }
     /// Returns the capabilities of the CPU
     pub fn cpu_caps(&self) -> u32 {
         (self.cpusubtype & CPU_SUBTYPE_MASK) >> 24
     }
 }
 
 impl ctx::SizeWith<container::Ctx> for Header {
-    type Units = usize;
     fn size_with(container: &container::Ctx) -> usize {
         match container.container {
             Container::Little => {
                 SIZEOF_HEADER_32
             },
             Container::Big => {
                 SIZEOF_HEADER_64
             },
         }
     }
 }
 
 impl ctx::SizeWith<Container> for Header {
-    type Units = usize;
     fn size_with(container: &Container) -> usize {
         match container {
             Container::Little => {
                 SIZEOF_HEADER_32
             },
             Container::Big => {
                 SIZEOF_HEADER_64
             },
         }
     }
 }
 
 impl<'a> ctx::TryFromCtx<'a, container::Ctx> for Header {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_from_ctx(bytes: &'a [u8], container::Ctx { le, container }: container::Ctx) -> error::Result<(Self, Self::Size)> {
+    fn try_from_ctx(bytes: &'a [u8], container::Ctx { le, container }: container::Ctx) -> error::Result<(Self, usize)> {
         let size = bytes.len();
         if size < SIZEOF_HEADER_32 || size < SIZEOF_HEADER_64 {
             let error = error::Error::Malformed("bytes size is smaller than a Mach-o header".into());
             Err(error)
         } else {
             match container {
                 Container::Little => {
                     let header = bytes.pread_with::<Header32>(0, le)?;
@@ -388,18 +385,17 @@ impl<'a> ctx::TryFromCtx<'a, container::
                 },
             }
         }
     }
 }
 
 impl ctx::TryIntoCtx<container::Ctx> for Header {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_into_ctx(self, bytes: &mut [u8], ctx: container::Ctx) -> error::Result<Self::Size> {
+    fn try_into_ctx(self, bytes: &mut [u8], ctx: container::Ctx) -> error::Result<usize> {
         match ctx.container {
             Container::Little => {
                 bytes.pwrite_with(Header32::from(self), 0, ctx.le)?;
             },
             Container::Big => {
                 bytes.pwrite_with(Header64::from(self), 0, ctx.le)?;
             }
         };
--- a/third_party/rust/goblin/src/mach/load_command.rs
+++ b/third_party/rust/goblin/src/mach/load_command.rs
@@ -492,18 +492,17 @@ impl ThreadCommand {
                 Err(error::Error::Malformed(format!("unable to find instruction pointer for cputype {:?}", cputype)))
             }
         }
     }
 }
 
 impl<'a> ctx::TryFromCtx<'a, Endian> for ThreadCommand {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_from_ctx(bytes: &'a [u8], le: Endian) -> error::Result<(Self, Self::Size)> {
+    fn try_from_ctx(bytes: &'a [u8], le: Endian) -> error::Result<(Self, usize)> {
         let lc = bytes.pread_with::<LoadCommandHeader>(0, le)?;
 
         // read the thread state flavor and length of the thread state
         let flavor: u32 = bytes.pread_with(8, le)?;
         let count: u32 = bytes.pread_with(12, le)?;
 
         // get a byte slice of the thread state
         let thread_state_byte_length = count as usize * 4;
@@ -1319,18 +1318,17 @@ pub enum CommandVariant {
     DylibCodeSignDrs       (LinkeditDataCommand),
     LinkerOption           (LinkeditDataCommand),
     LinkerOptimizationHint (LinkeditDataCommand),
     Unimplemented          (LoadCommandHeader),
 }
 
 impl<'a> ctx::TryFromCtx<'a, Endian> for CommandVariant {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_from_ctx(bytes: &'a [u8], le: Endian) -> error::Result<(Self, Self::Size)> {
+    fn try_from_ctx(bytes: &'a [u8], le: Endian) -> error::Result<(Self, usize)> {
         use self::CommandVariant::*;
         let lc = bytes.pread_with::<LoadCommandHeader>(0, le)?;
         let size = lc.cmdsize as usize;
         //println!("offset {:#x} cmd: {:#x} size: {:?} ctx: {:?}", offset, lc.cmd, size, le);
         if size > bytes.len() { return Err(error::Error::Malformed(format!("{} has size larger than remainder of binary: {:?}", &lc, bytes.len()))) }
         match lc.cmd {
             LC_SEGMENT    => {              let comm = bytes.pread_with::<SegmentCommand32>       (0, le)?;  Ok((Segment32              (comm), size))},
             LC_SEGMENT_64 => {              let comm = bytes.pread_with::<SegmentCommand64>       (0, le)?;  Ok((Segment64              (comm), size))},
--- a/third_party/rust/goblin/src/mach/segment.rs
+++ b/third_party/rust/goblin/src/mach/segment.rs
@@ -8,16 +8,17 @@ use core::ops::{Deref, DerefMut};
 use crate::alloc::boxed::Box;
 use crate::alloc::vec::Vec;
 
 use crate::container;
 use crate::error;
 
 use crate::mach::relocation::RelocationInfo;
 use crate::mach::load_command::{Section32, Section64, SegmentCommand32, SegmentCommand64, SIZEOF_SECTION_32, SIZEOF_SECTION_64, SIZEOF_SEGMENT_COMMAND_32, SIZEOF_SEGMENT_COMMAND_64, LC_SEGMENT, LC_SEGMENT_64};
+use crate::mach::constants::{SECTION_TYPE, S_ZEROFILL};
 
 pub struct RelocationIterator<'a> {
     data: &'a [u8],
     nrelocs: usize,
     offset: usize,
     count: usize,
     ctx: scroll::Endian,
 }
@@ -165,45 +166,42 @@ impl From<Section64> for Section {
             nreloc:   section.nreloc,
             flags:    section.flags,
         }
     }
 }
 
 impl<'a> ctx::TryFromCtx<'a, container::Ctx> for Section {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_from_ctx(bytes: &'a [u8], ctx: container::Ctx) -> Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(bytes: &'a [u8], ctx: container::Ctx) -> Result<(Self, usize), Self::Error> {
         match ctx.container {
             container::Container::Little => {
                 let section = Section::from(bytes.pread_with::<Section32>(0, ctx.le)?);
                 Ok((section, SIZEOF_SECTION_32))
             },
             container::Container::Big    => {
                 let section = Section::from(bytes.pread_with::<Section64>(0, ctx.le)?);
                 Ok((section, SIZEOF_SECTION_64))
             },
         }
     }
 }
 
 impl ctx::SizeWith<container::Ctx> for Section {
-    type Units = usize;
     fn size_with(ctx: &container::Ctx) -> usize {
         match ctx.container {
             container::Container::Little => SIZEOF_SECTION_32,
             container::Container::Big    => SIZEOF_SECTION_64,
         }
     }
 }
 
 impl ctx::TryIntoCtx<container::Ctx> for Section {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_into_ctx(self, bytes: &mut [u8], ctx: container::Ctx) -> Result<Self::Size, Self::Error> {
+    fn try_into_ctx(self, bytes: &mut [u8], ctx: container::Ctx) -> Result<usize, Self::Error> {
         if ctx.is_big () {
             bytes.pwrite_with::<Section64>(self.into(), 0, ctx.le)?;
         } else {
             bytes.pwrite_with::<Section32>(self.into(), 0, ctx.le)?;
         }
         Ok(Self::size_with(&ctx))
     }
 }
@@ -234,32 +232,36 @@ impl<'a> Iterator for SectionIterator<'a
     type Item = error::Result<(Section, SectionData<'a>)>;
     fn next(&mut self) -> Option<Self::Item> {
         if self.idx >= self.count {
             None
         } else {
             self.idx += 1;
             match self.data.gread_with::<Section>(&mut self.offset, self.ctx) {
                 Ok(section) => {
-                    // it's not uncommon to encounter macho files where files are
-                    // truncated but the sections are still remaining in the header.
-                    // Because of this we want to not panic here but instead just
-                    // slice down to a empty data slice.  This way only if code
-                    // actually needs to access those sections it will fall over.
-                    let data = self.data
-                        .get(section.offset as usize..)
-                        .unwrap_or_else(|| {
-                            warn!("section #{} offset {} out of bounds", self.idx, section.offset);
-                            &[]
-                        })
-                        .get(..section.size as usize)
-                        .unwrap_or_else(|| {
-                            warn!("section #{} size {} out of bounds", self.idx, section.size);
-                            &[]
-                        });
+                    let data = if section.flags & SECTION_TYPE == S_ZEROFILL {
+                        &[]
+                    } else {
+                        // it's not uncommon to encounter macho files where files are
+                        // truncated but the sections are still remaining in the header.
+                        // Because of this we want to not panic here but instead just
+                        // slice down to a empty data slice.  This way only if code
+                        // actually needs to access those sections it will fall over.
+                        self.data
+                            .get(section.offset as usize..)
+                            .unwrap_or_else(|| {
+                                warn!("section #{} offset {} out of bounds", self.idx, section.offset);
+                                &[]
+                            })
+                            .get(..section.size as usize)
+                            .unwrap_or_else(|| {
+                                warn!("section #{} size {} out of bounds", self.idx, section.size);
+                                &[]
+                            })
+                    };
                     Some(Ok((section, data)))
                 },
                 Err(e) => Some(Err(e))
             }
         }
     }
 }
 
@@ -350,29 +352,27 @@ impl<'a> fmt::Debug for Segment<'a> {
             .field("sections()", &self.sections().map(|sections|
                 sections.into_iter().map(|(section,_)| section).collect::<Vec<_>>())
             )
             .finish()
     }
 }
 
 impl<'a> ctx::SizeWith<container::Ctx> for Segment<'a> {
-    type Units = usize;
     fn size_with(ctx: &container::Ctx) -> usize {
         match ctx.container {
             container::Container::Little => SIZEOF_SEGMENT_COMMAND_32,
             container::Container::Big    => SIZEOF_SEGMENT_COMMAND_64,
         }
     }
 }
 
 impl<'a> ctx::TryIntoCtx<container::Ctx> for Segment<'a> {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_into_ctx(self, bytes: &mut [u8], ctx: container::Ctx) -> Result<Self::Size, Self::Error> {
+    fn try_into_ctx(self, bytes: &mut [u8], ctx: container::Ctx) -> Result<usize, Self::Error> {
         let segment_size = Self::size_with(&ctx);
         // should be able to write the section data inline after this, but not working at the moment
         //let section_size = bytes.pwrite(data, segment_size)?;
         //debug!("Segment size: {} raw section data size: {}", segment_size, data.len());
         if ctx.is_big () {
             bytes.pwrite_with::<SegmentCommand64>(self.into(), 0, ctx.le)?;
         } else {
             bytes.pwrite_with::<SegmentCommand32>(self.into(), 0, ctx.le)?;
@@ -441,17 +441,17 @@ impl<'a> Segment<'a> {
             vmaddr:   u64::from(segment.vmaddr),
             vmsize:   u64::from(segment.vmsize),
             fileoff:  u64::from(segment.fileoff),
             filesize: u64::from(segment.filesize),
             maxprot:  segment.maxprot,
             initprot: segment.initprot,
             nsects:   segment.nsects,
             flags:    segment.flags,
-            data: segment_data(bytes, segment.fileoff as u64, segment.filesize as u64)?,
+            data: segment_data(bytes, u64::from(segment.fileoff), u64::from(segment.filesize))?,
             offset,
             raw_data: bytes,
             ctx,
         })
     }
     /// Convert the raw C 64-bit segment command to a generalized version
     pub fn from_64(bytes: &'a [u8], segment: &SegmentCommand64, offset: usize, ctx: container::Ctx) -> Result<Self, error::Error> {
         Ok(Segment {
@@ -507,12 +507,12 @@ impl<'a> Segments<'a> {
     pub fn new(ctx: container::Ctx) -> Self {
         Segments {
             segments: Vec::new(),
             ctx,
         }
     }
     /// Get every section from every segment
     // thanks to SpaceManic for figuring out the 'b lifetimes here :)
-    pub fn sections<'b>(&'b self) -> Box<Iterator<Item=SectionIterator<'a>> + 'b> {
+    pub fn sections<'b>(&'b self) -> Box<dyn Iterator<Item=SectionIterator<'a>> + 'b> {
         Box::new(self.segments.iter().map(|segment| segment.into_iter()))
     }
 }
--- a/third_party/rust/goblin/src/mach/symbols.rs
+++ b/third_party/rust/goblin/src/mach/symbols.rs
@@ -231,17 +231,16 @@ impl Nlist {
     }
     /// Whether this symbol is a symbolic debugging entry
     pub fn is_stab(&self) -> bool {
         self.n_type & N_STAB != 0
     }
 }
 
 impl ctx::SizeWith<container::Ctx> for Nlist {
-    type Units = usize;
     fn size_with(ctx: &container::Ctx) -> usize {
         match ctx.container {
             Container::Little => {
                 SIZEOF_NLIST_32
             },
             Container::Big => {
                 SIZEOF_NLIST_64
             },
@@ -294,35 +293,32 @@ impl From<Nlist> for Nlist64 {
             n_desc: nlist.n_desc,
             n_value: nlist.n_value,
         }
     }
 }
 
 impl<'a> ctx::TryFromCtx<'a, container::Ctx> for Nlist {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_from_ctx(bytes: &'a [u8], container::Ctx { container, le }: container::Ctx) -> crate::error::Result<(Self, Self::Size)> {
+    fn try_from_ctx(bytes: &'a [u8], container::Ctx { container, le }: container::Ctx) -> crate::error::Result<(Self, usize)> {
         let nlist = match container {
             Container::Little => {
                 (bytes.pread_with::<Nlist32>(0, le)?.into(), SIZEOF_NLIST_32)
             },
             Container::Big => {
                 (bytes.pread_with::<Nlist64>(0, le)?.into(), SIZEOF_NLIST_64)
             },
         };
         Ok(nlist)
     }
 }
 
 impl ctx::TryIntoCtx<container::Ctx> for Nlist {
     type Error = crate::error::Error;
-    type Size = usize;
-
-    fn try_into_ctx(self, bytes: &mut [u8], container::Ctx { container, le }: container::Ctx) -> Result<Self::Size, Self::Error> {
+    fn try_into_ctx(self, bytes: &mut [u8], container::Ctx { container, le }: container::Ctx) -> Result<usize, Self::Error> {
         let size = match container {
             Container::Little => {
                 (bytes.pwrite_with::<Nlist32>(self.into(), 0, le)?)
             },
             Container::Big => {
                 (bytes.pwrite_with::<Nlist64>(self.into(), 0, le)?)
             },
         };
@@ -340,20 +336,19 @@ impl ctx::IntoCtx<container::Ctx> for Nl
 pub struct SymbolsCtx {
     pub nsyms: usize,
     pub strtab: usize,
     pub ctx: container::Ctx,
 }
 
 impl<'a, T: ?Sized> ctx::TryFromCtx<'a, SymbolsCtx, T> for Symbols<'a> where T: AsRef<[u8]> {
     type Error = crate::error::Error;
-    type Size = usize;
     fn try_from_ctx(bytes: &'a T, SymbolsCtx {
         nsyms, strtab, ctx
-    }: SymbolsCtx) -> crate::error::Result<(Self, Self::Size)> {
+    }: SymbolsCtx) -> crate::error::Result<(Self, usize)> {
         let data = bytes.as_ref();
         Ok ((Symbols {
             data,
             start: 0,
             nsyms,
             strtab,
             ctx,
         }, data.len()))
--- a/third_party/rust/goblin/src/pe/debug.rs
+++ b/third_party/rust/goblin/src/pe/debug.rs
@@ -51,17 +51,17 @@ pub const IMAGE_DEBUG_TYPE_FPO: u32 = 3;
 pub const IMAGE_DEBUG_TYPE_MISC: u32 = 4;
 pub const IMAGE_DEBUG_TYPE_EXCEPTION: u32 = 5;
 pub const IMAGE_DEBUG_TYPE_FIXUP: u32 = 6;
 pub const IMAGE_DEBUG_TYPE_BORLAND: u32 = 9;
 
 impl ImageDebugDirectory {
     fn parse(bytes: &[u8], dd: data_directories::DataDirectory, sections: &[section_table::SectionTable], file_alignment: u32) -> error::Result<Self> {
         let rva = dd.virtual_address as usize;
-        let offset = utils::find_offset(rva, sections, file_alignment).ok_or_else(|| error::Error::Malformed(format!("Cannot map ImageDebugDirectory rva {:#x} into offset", rva)))?;;
+        let offset = utils::find_offset(rva, sections, file_alignment).ok_or_else(|| error::Error::Malformed(format!("Cannot map ImageDebugDirectory rva {:#x} into offset", rva)))?;
         let idd: Self = bytes.pread_with(offset, scroll::LE)?;
         Ok (idd)
     }
 }
 
 pub const CODEVIEW_PDB70_MAGIC: u32 = 0x5344_5352;
 pub const CODEVIEW_PDB20_MAGIC: u32 = 0x3031_424e;
 pub const CODEVIEW_CV50_MAGIC: u32 = 0x3131_424e;
--- a/third_party/rust/goblin/src/pe/exception.rs
+++ b/third_party/rust/goblin/src/pe/exception.rs
@@ -340,23 +340,21 @@ pub struct UnwindCode {
     pub code_offset: u8,
 
     /// The operation that was performed by the code in the prolog.
     pub operation: UnwindOperation,
 }
 
 impl<'a> TryFromCtx<'a, UnwindOpContext> for UnwindCode {
     type Error = error::Error;
-    type Size = usize;
-
     #[inline]
     fn try_from_ctx(
         bytes: &'a [u8],
         ctx: UnwindOpContext,
-    ) -> Result<(Self, Self::Size), Self::Error> {
+    ) -> Result<(Self, usize), Self::Error> {
         let mut read = 0;
         let code_offset = bytes.gread_with::<u8>(&mut read, scroll::LE)?;
         let operation = bytes.gread_with::<u8>(&mut read, scroll::LE)?;
 
         let operation_code = operation & 0xf;
         let operation_info = operation >> 4;
 
         let operation = match operation_code {
@@ -670,29 +668,29 @@ impl<'a> ExceptionData<'a> {
         bytes: &'a [u8],
         directory: data_directories::DataDirectory,
         sections: &[section_table::SectionTable],
         file_alignment: u32,
     ) -> error::Result<Self> {
         let size = directory.size as usize;
 
         if size % RUNTIME_FUNCTION_SIZE != 0 {
-            Err(scroll::Error::BadInput {
+            return Err(error::Error::from(scroll::Error::BadInput {
                 size,
                 msg: "invalid exception directory table size",
-            })?;
+            }));
         }
 
         let rva = directory.virtual_address as usize;
         let offset = utils::find_offset(rva, sections, file_alignment).ok_or_else(|| {
             error::Error::Malformed(format!("cannot map exception_rva ({:#x}) into offset", rva))
         })?;
 
         if offset % 4 != 0 {
-            Err(scroll::Error::BadOffset(offset))?;
+            return Err(error::Error::from(scroll::Error::BadOffset(offset)));
         }
 
         Ok(ExceptionData {
             bytes,
             offset,
             size,
             file_alignment,
         })
@@ -718,17 +716,17 @@ impl<'a> ExceptionData<'a> {
     pub fn functions(&self) -> RuntimeFunctionIterator<'a> {
         RuntimeFunctionIterator {
             data: &self.bytes[self.offset..self.offset + self.size],
         }
     }
 
     /// Returns the function at the given index.
     pub fn get_function(&self, index: usize) -> error::Result<RuntimeFunction> {
-        self.get_function_by_offset(index * RUNTIME_FUNCTION_SIZE)
+        self.get_function_by_offset(self.offset + index * RUNTIME_FUNCTION_SIZE)
     }
 
     /// Performs a binary search to find a function entry covering the given RVA relative to the
     /// image.
     pub fn find_function(&self, rva: u32) -> error::Result<Option<RuntimeFunction>> {
         // NB: Binary search implementation copied from std::slice::binary_search_by and adapted.
         // Theoretically, there should be nothing that causes parsing runtime functions to fail and
         // all access to the bytes buffer is guaranteed to be in range. However, since all other
@@ -792,20 +790,20 @@ impl<'a> ExceptionData<'a> {
             error::Error::Malformed(format!("cannot map exception rva ({:#x}) into offset", rva))
         })?;
 
         self.get_function_by_offset(offset)
     }
 
     #[inline]
     fn get_function_by_offset(&self, offset: usize) -> error::Result<RuntimeFunction> {
-        debug_assert!(offset % RUNTIME_FUNCTION_SIZE == 0);
-        debug_assert!(offset < self.size);
+        debug_assert!((offset - self.offset) % RUNTIME_FUNCTION_SIZE == 0);
+        debug_assert!(offset < self.offset + self.size);
 
-        Ok(self.bytes.pread_with(self.offset + offset, scroll::LE)?)
+        Ok(self.bytes.pread_with(offset, scroll::LE)?)
     }
 }
 
 impl fmt::Debug for ExceptionData<'_> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.debug_struct("ExceptionData")
             .field("file_alignment", &self.file_alignment)
             .field("offset", &format_args!("{:#x}", self.offset))
@@ -819,8 +817,202 @@ impl<'a> IntoIterator for &'_ ExceptionD
     type Item = error::Result<RuntimeFunction>;
     type IntoIter = RuntimeFunctionIterator<'a>;
 
     #[inline]
     fn into_iter(self) -> Self::IntoIter {
         self.functions()
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_size_of_runtime_function() {
+        assert_eq!(
+            std::mem::size_of::<RuntimeFunction>(),
+            RUNTIME_FUNCTION_SIZE
+        );
+    }
+
+    // Tests disabled until there is a solution for handling binary test data
+    // See https://github.com/m4b/goblin/issues/185
+
+    // macro_rules! microsoft_symbol {
+    //     ($name:literal, $id:literal) => {{
+    //         use std::fs::File;
+    //         use std::path::Path;
+
+    //         let path = Path::new(concat!("cache/", $name));
+    //         if !path.exists() {
+    //             let url = format!(
+    //                 "https://msdl.microsoft.com/download/symbols/{}/{}/{}",
+    //                 $name, $id, $name
+    //             );
+
+    //             let mut response = reqwest::get(&url).expect(concat!("get ", $name));
+    //             let mut target = File::create(path).expect(concat!("create ", $name));
+    //             response
+    //                 .copy_to(&mut target)
+    //                 .expect(concat!("download ", $name));
+    //         }
+
+    //         std::fs::read(path).expect(concat!("open ", $name))
+    //     }};
+    // }
+
+    // lazy_static::lazy_static! {
+    //     static ref PE_DATA: Vec<u8> = microsoft_symbol!("WSHTCPIP.DLL", "4a5be0b77000");
+    // }
+
+    // #[test]
+    // fn test_parse() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     assert_eq!(exception_data.len(), 19);
+    //     assert!(!exception_data.is_empty());
+    // }
+
+    // #[test]
+    // fn test_iter_functions() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     let functions: Vec<RuntimeFunction> = exception_data
+    //         .functions()
+    //         .map(|result| result.expect("parse runtime function"))
+    //         .collect();
+
+    //     assert_eq!(functions.len(), 19);
+
+    //     let expected = RuntimeFunction {
+    //         begin_address: 0x1355,
+    //         end_address: 0x1420,
+    //         unwind_info_address: 0x4019,
+    //     };
+
+    //     assert_eq!(functions[4], expected);
+    // }
+
+    // #[test]
+    // fn test_get_function() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     let expected = RuntimeFunction {
+    //         begin_address: 0x1355,
+    //         end_address: 0x1420,
+    //         unwind_info_address: 0x4019,
+    //     };
+
+    //     assert_eq!(
+    //         exception_data.get_function(4).expect("find function"),
+    //         expected
+    //     );
+    // }
+
+    // #[test]
+    // fn test_find_function() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     let expected = RuntimeFunction {
+    //         begin_address: 0x1355,
+    //         end_address: 0x1420,
+    //         unwind_info_address: 0x4019,
+    //     };
+
+    //     assert_eq!(
+    //         exception_data.find_function(0x1400).expect("find function"),
+    //         Some(expected)
+    //     );
+    // }
+
+    // #[test]
+    // fn test_find_function_none() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     // 0x1d00 is the end address of the last function.
+
+    //     assert_eq!(
+    //         exception_data.find_function(0x1d00).expect("find function"),
+    //         None
+    //     );
+    // }
+
+    // #[test]
+    // fn test_get_unwind_info() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     // runtime function #0 directly refers to unwind info
+    //     let rt_function = RuntimeFunction {
+    //         begin_address: 0x1010,
+    //         end_address: 0x1090,
+    //         unwind_info_address: 0x25d8,
+    //     };
+
+    //     let unwind_info = exception_data
+    //         .get_unwind_info(rt_function, &pe.sections)
+    //         .expect("get unwind info");
+
+    //     // Unwind codes just used to assert that the right unwind info was resolved
+    //     let expected = &[4, 98];
+
+    //     assert_eq!(unwind_info.code_bytes, expected);
+    // }
+
+    // #[test]
+    // fn test_get_unwind_info_redirect() {
+    //     let pe = PE::parse(&PE_DATA).expect("parse PE");
+    //     let exception_data = pe.exception_data.expect("get exception data");
+
+    //     // runtime function #4 has a redirect (unwind_info_address & 1).
+    //     let rt_function = RuntimeFunction {
+    //         begin_address: 0x1355,
+    //         end_address: 0x1420,
+    //         unwind_info_address: 0x4019,
+    //     };
+
+    //     let unwind_info = exception_data
+    //         .get_unwind_info(rt_function, &pe.sections)
+    //         .expect("get unwind info");
+
+    //     // Unwind codes just used to assert that the right unwind info was resolved
+    //     let expected = &[
+    //         28, 100, 15, 0, 28, 84, 14, 0, 28, 52, 12, 0, 28, 82, 24, 240, 22, 224, 20, 208, 18,
+    //         192, 16, 112,
+    //     ];
+
+    //     assert_eq!(unwind_info.code_bytes, expected);
+    // }
+
+    #[test]
+    fn test_iter_unwind_codes() {
+        let unwind_info = UnwindInfo {
+            version: 1,
+            size_of_prolog: 4,
+            frame_register: Register(0),
+            frame_register_offset: 0,
+            chained_info: None,
+            handler: None,
+            code_bytes: &[4, 98],
+        };
+
+        let unwind_codes: Vec<UnwindCode> = unwind_info
+            .unwind_codes()
+            .map(|result| result.expect("parse unwind code"))
+            .collect();
+
+        assert_eq!(unwind_codes.len(), 1);
+
+        let expected = UnwindCode {
+            code_offset: 4,
+            operation: UnwindOperation::Alloc(56),
+        };
+
+        assert_eq!(unwind_codes[0], expected);
+    }
+}
--- a/third_party/rust/goblin/src/pe/export.rs
+++ b/third_party/rust/goblin/src/pe/export.rs
@@ -137,48 +137,45 @@ impl<'a> ExportData<'a> {
         })
     }
 }
 
 #[derive(Debug)]
 /// PE binaries have two kinds of reexports, either specifying the dll's name, or the ordinal value of the dll
 pub enum Reexport<'a> {
   DLLName { export: &'a str, lib: &'a str },
-  DLLOrdinal { export: &'a str, ordinal: usize }
+  DLLOrdinal { ordinal: usize, lib: &'a str }
 }
 
 impl<'a> scroll::ctx::TryFromCtx<'a, scroll::Endian> for Reexport<'a> {
     type Error = crate::error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(bytes: &'a [u8], _ctx: scroll::Endian) -> Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(bytes: &'a [u8], _ctx: scroll::Endian) -> Result<(Self, usize), Self::Error> {
         let reexport = bytes.pread::<&str>(0)?;
         let reexport_len = reexport.len();
         debug!("reexport: {}", &reexport);
         for o in 0..reexport_len {
             let c: u8 = bytes.pread(o)?;
             debug!("reexport offset: {:#x} char: {:#x}", o, c);
             if c == b'.' {
-                let i = o - 1;
-                let dll: &'a str = bytes.pread_with(0, scroll::ctx::StrCtx::Length(i))?;
+                let dll: &'a str = bytes.pread_with(0, scroll::ctx::StrCtx::Length(o))?;
                 debug!("dll: {:?}", &dll);
-                let len = reexport_len - i - 1;
-                let rest: &'a [u8] = bytes.pread_with(o, len)?;
+                if o + 1 == reexport_len {
+                    break;
+                }
+                let len = reexport_len - o - 1;
+                let rest: &'a [u8] = bytes.pread_with(o + 1, len)?;
                 debug!("rest: {:?}", &rest);
-                let len = rest.len() - 1;
                 if rest[0] == b'#' {
-                    // UNTESTED
-                    let ordinal = rest.pread_with::<&str>(1, scroll::ctx::StrCtx::Length(len))?;
+                    let ordinal = rest.pread_with::<&str>(1, scroll::ctx::StrCtx::Length(len - 1))?;
                     let ordinal = ordinal.parse::<u32>().map_err(|_e| error::Error::Malformed(format!("Cannot parse reexport ordinal from {} bytes", bytes.len())))?;
-                    // FIXME: return size
-                    return Ok((Reexport::DLLOrdinal { export: dll, ordinal: ordinal as usize }, 0))
+                    return Ok((Reexport::DLLOrdinal { ordinal: ordinal as usize, lib: dll }, reexport_len + 1))
                 } else {
-                    let export = rest.pread_with::<&str>(1, scroll::ctx::StrCtx::Length(len))?;
-                    // FIXME: return size
-                    return Ok((Reexport::DLLName { export, lib: dll }, 0))
+                    let export = rest.pread_with::<&str>(0, scroll::ctx::StrCtx::Length(len))?;
+                    return Ok((Reexport::DLLName { export, lib: dll }, reexport_len + 1))
                 }
             }
         }
         Err(error::Error::Malformed(format!("Reexport {:#} is malformed", reexport)))
     }
 }
 
 impl<'a> Reexport<'a> {
@@ -204,19 +201,18 @@ struct ExportCtx<'a> {
     pub sections: &'a [section_table::SectionTable],
     pub file_alignment: u32,
     pub addresses: &'a ExportAddressTable,
     pub ordinals: &'a ExportOrdinalTable,
 }
 
 impl<'a, 'b> scroll::ctx::TryFromCtx<'a, ExportCtx<'b>> for Export<'a> {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(bytes: &'a [u8], ExportCtx { ptr, idx, sections, file_alignment, addresses, ordinals }: ExportCtx<'b>) -> Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(bytes: &'a [u8], ExportCtx { ptr, idx, sections, file_alignment, addresses, ordinals }: ExportCtx<'b>) -> Result<(Self, usize), Self::Error> {
         use self::ExportAddressTableEntry::*;
 
         let name = utils::find_offset(ptr as usize, sections, file_alignment).and_then(|offset| bytes.pread::<&str>(offset).ok());
 
         if let Some(ordinal) = ordinals.get(idx) {
             if let Some(rva) = addresses.get(*ordinal as usize) {
                 match *rva {
                     ExportRVA(rva) => {
--- a/third_party/rust/goblin/src/pe/import.rs
+++ b/third_party/rust/goblin/src/pe/import.rs
@@ -12,17 +12,17 @@ use crate::pe::data_directories;
 
 use log::{debug, warn};
 
 pub const IMPORT_BY_ORDINAL_32: u32 = 0x8000_0000;
 pub const IMPORT_BY_ORDINAL_64: u64 = 0x8000_0000_0000_0000;
 pub const IMPORT_RVA_MASK_32: u32 = 0x7fff_ffff;
 pub const IMPORT_RVA_MASK_64: u64 = 0x0000_0000_7fff_ffff;
 
-pub trait Bitfield<'a>: Into<u64> + PartialEq + Eq + LowerHex + Debug + TryFromCtx<'a, scroll::Endian, Error=scroll::Error, Size=usize> {
+pub trait Bitfield<'a>: Into<u64> + PartialEq + Eq + LowerHex + Debug + TryFromCtx<'a, scroll::Endian, Error=scroll::Error> {
     fn is_ordinal(&self) -> bool;
     fn to_ordinal(&self) -> u16;
     fn to_rva(&self) -> u32;
     fn size_of() -> usize;
     fn is_zero(&self) -> bool;
 }
 
 impl<'a> Bitfield<'a> for u64 {
@@ -184,17 +184,17 @@ impl<'a> SyntheticImportDirectoryEntry<'
 pub struct ImportData<'a> {
     pub import_data: Vec<SyntheticImportDirectoryEntry<'a>>,
 }
 
 impl<'a> ImportData<'a> {
     pub fn parse<T: Bitfield<'a>>(bytes: &'a[u8], dd: data_directories::DataDirectory, sections: &[section_table::SectionTable], file_alignment: u32) -> error::Result<ImportData<'a>> {
         let import_directory_table_rva = dd.virtual_address as usize;
         debug!("import_directory_table_rva {:#x}", import_directory_table_rva);
-        let offset = &mut utils::find_offset(import_directory_table_rva, sections, file_alignment).ok_or_else(|| error::Error::Malformed(format!("Cannot create ImportData; cannot map import_directory_table_rva {:#x} into offset", import_directory_table_rva)))?;;
+        let offset = &mut utils::find_offset(import_directory_table_rva, sections, file_alignment).ok_or_else(|| error::Error::Malformed(format!("Cannot create ImportData; cannot map import_directory_table_rva {:#x} into offset", import_directory_table_rva)))?;
         debug!("import data offset {:#x}", offset);
         let mut import_data = Vec::new();
         loop {
             let import_directory_entry: ImportDirectoryEntry = bytes.gread_with(offset, scroll::LE)?;
             debug!("{:#?}", import_directory_entry);
             if import_directory_entry.is_null() {
                 break;
             } else {
--- a/third_party/rust/goblin/src/pe/mod.rs
+++ b/third_party/rust/goblin/src/pe/mod.rs
@@ -111,19 +111,22 @@ impl<'a> PE<'a> {
                 libraries.dedup();
                 import_data = Some(id);
             }
             debug!("imports: {:#?}", imports);
             if let Some(debug_table) = *optional_header.data_directories.get_debug_table() {
                 debug_data = Some(debug::DebugData::parse(bytes, debug_table, &sections, file_alignment)?);
             }
 
-            debug!("exception data: {:#?}", exception_data);
-            if let Some(exception_table) = *optional_header.data_directories.get_exception_table() {
-                exception_data = Some(exception::ExceptionData::parse(bytes, exception_table, &sections, file_alignment)?);
+            if header.coff_header.machine == header::COFF_MACHINE_X86_64 {
+                // currently only x86_64 is supported
+                debug!("exception data: {:#?}", exception_data);
+                if let Some(exception_table) = *optional_header.data_directories.get_exception_table() {
+                    exception_data = Some(exception::ExceptionData::parse(bytes, exception_table, &sections, file_alignment)?);
+                }
             }
         }
         Ok( PE {
             header,
             sections,
             size: 0,
             name,
             is_lib,
--- a/third_party/rust/goblin/src/pe/optional_header.rs
+++ b/third_party/rust/goblin/src/pe/optional_header.rs
@@ -258,18 +258,17 @@ impl OptionalHeader {
                 Err(error::Error::BadMagic(u64::from(magic)))
             }
         }
     }
 }
 
 impl<'a> ctx::TryFromCtx<'a, Endian> for OptionalHeader {
     type Error = crate::error::Error;
-    type Size = usize;
-    fn try_from_ctx(bytes: &'a [u8], _: Endian) -> error::Result<(Self, Self::Size)> {
+    fn try_from_ctx(bytes: &'a [u8], _: Endian) -> error::Result<(Self, usize)> {
         let magic = bytes.pread_with::<u16>(0, LE)?;
         let offset = &mut 0;
         let (standard_fields, windows_fields): (StandardFields, WindowsFields) = match magic {
             MAGIC_32 => {
                 let standard_fields = bytes.gread_with::<StandardFields32>(offset, LE)?.into();
                 let windows_fields = bytes.gread_with::<WindowsFields32>(offset, LE)?.into();
                 (standard_fields, windows_fields)
             },
--- a/third_party/rust/goblin/src/pe/section_table.rs
+++ b/third_party/rust/goblin/src/pe/section_table.rs
@@ -83,16 +83,17 @@ impl SectionTable {
                     Error::Malformed(format!("Invalid indirect section name /{}: {}", name, err)))?
             };
             Ok(Some(idx))
         } else {
             Ok(None)
         }
     }
 
+    #[allow(clippy::useless_let_if_seq)]
     pub fn set_name_offset(&mut self, mut idx: usize) -> error::Result<()> {
         if idx <= 9_999_999 { // 10^7 - 1
             // write!(&mut self.name[1..], "{}", idx) without using io::Write.
             // We write into a temporary since we calculate digits starting at the right.
             let mut name = [0; 7];
             let mut len = 0;
             if idx == 0 {
                 name[6] = b'0';
@@ -141,26 +142,24 @@ impl SectionTable {
     pub fn relocations<'a>(&self, bytes: &'a[u8]) -> error::Result<relocation::Relocations<'a>> {
         let offset = self.pointer_to_relocations as usize;
         let number = self.number_of_relocations as usize;
         relocation::Relocations::parse(bytes, offset, number)
     }
 }
 
 impl ctx::SizeWith<scroll::Endian> for SectionTable {
-    type Units = usize;
     fn size_with(_ctx: &scroll::Endian) -> usize {
         SIZEOF_SECTION_TABLE
     }
 }
 
 impl ctx::TryIntoCtx<scroll::Endian> for SectionTable {
     type Error = error::Error;
-    type Size = usize;
-    fn try_into_ctx(self, bytes: &mut [u8], ctx: scroll::Endian) -> Result<Self::Size, Self::Error> {
+    fn try_into_ctx(self, bytes: &mut [u8], ctx: scroll::Endian) -> Result<usize, Self::Error> {
         let offset = &mut 0;
         bytes.gwrite(&self.name[..], offset)?;
         bytes.gwrite_with(self.virtual_size, offset, ctx)?;
         bytes.gwrite_with(self.virtual_address, offset, ctx)?;
         bytes.gwrite_with(self.size_of_raw_data, offset, ctx)?;
         bytes.gwrite_with(self.pointer_to_raw_data, offset, ctx)?;
         bytes.gwrite_with(self.pointer_to_relocations, offset, ctx)?;
         bytes.gwrite_with(self.pointer_to_linenumbers, offset, ctx)?;
--- a/third_party/rust/goblin/src/pe/utils.rs
+++ b/third_party/rust/goblin/src/pe/utils.rs
@@ -74,15 +74,15 @@ pub fn try_name<'a>(bytes: &'a [u8], rva
         },
         None => {
             Err(error::Error::Malformed(format!("Cannot find name from rva {:#x} in sections: {:?}", rva, sections)))
         }
     }
 }
 
 pub fn get_data<'a, T>(bytes: &'a [u8], sections: &[section_table::SectionTable], directory: DataDirectory, file_alignment: u32) -> error::Result<T>
-    where T: scroll::ctx::TryFromCtx<'a, scroll::Endian, Size = usize, Error = scroll::Error>  {
+    where T: scroll::ctx::TryFromCtx<'a, scroll::Endian, Error = scroll::Error>  {
     let rva = directory.virtual_address as usize;
     let offset = find_offset(rva, sections, file_alignment)
         .ok_or_else(||error::Error::Malformed(directory.virtual_address.to_string()))?;
     let result: T = bytes.pread_with(offset, scroll::LE)?;
     Ok(result)
 }
--- a/third_party/rust/goblin/tests/archive.rs
+++ b/third_party/rust/goblin/tests/archive.rs
@@ -54,17 +54,17 @@ fn parse_self() {
     use std::fs;
     use std::io::Read;
     let mut path = Path::new("target").join("debug").join("libgoblin.rlib");
     // https://github.com/m4b/goblin/issues/63
     if fs::metadata(&path).is_err() {
         path = Path::new("target").join("release").join("libgoblin.rlib");
     }
     let buffer = {
-        let mut fd = File::open(path).expect("open file");
+        let mut fd = File::open(path).expect("can open file; did you run cargo build first?");
         let mut v = Vec::new();
         fd.read_to_end(&mut v).expect("read file");
         v
     };
 
     let archive = Archive::parse(&buffer).expect("parse rlib");
 
     // check that the archive has a useful symbol table by counting the total number of symbols
--- a/third_party/rust/object/.cargo-checksum.json
+++ b/third_party/rust/object/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.lock":"13d8a3b24f9bc7dc5cfcd74213f91d9c122ea1a790085b7d103af3f5c602de76","Cargo.toml":"24e6d432f81cc2b4f74e402c73853de7ba4d1e8f1bddc47966b1e19dc611f8b4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0b74dfa0bcee5c420c6b7f67b4b2658f9ab8388c97b8e733975f2cecbdd668a6","README.md":"5c498b93ff10c038784c5b62c346858c0d53d9d6d1591841c5b6724b0abc9415","examples/nm.rs":"9885cb85700512d63e537b4b60bd2c840aa076721eae2059ba6ae3651be1282e","examples/objcopy.rs":"6b51b89bea2d9bd5d8651942a2a5c5637e4553b8beeda47221470f676f23ede0","examples/objdump.rs":"07a23a2f74b7e46d4cdcf4dab23357a39410b4c4db43179c17e059011e40d45c","src/common.rs":"143f42a0e085e82a022b85680d42322ac912eefc4ab2cb2bee687368fa8615a5","src/lib.rs":"7e559b0af48faca419086a743e3f99794e10a91e8619f8c6e26f113d1935fe14","src/read/any.rs":"12be08836fb2f66026b34434b47cfe275f82cf31b05039ef0545fc324a3b9bce","src/read/coff.rs":"f3a16d71ec8c5692f5435bf51a3ecda49dc727d5d93f5cdef67e7853e31e6dfa","src/read/elf.rs":"eef3db7f9a0adea79a488548e57270752c5bc79fef6b23beae054d2b29a6acb0","src/read/macho.rs":"236af20d251a618861fce9bd1efac21f239e0e59777b31b256c43085a4497247","src/read/mod.rs":"efdb99a566a971bca815e1d1dd85b9e9800fbe4e3572cf54a7b0ff54111469c2","src/read/pe.rs":"423527bb5fb5b234057d51925f6ac3ea05603618c1d8c6165de2f9c819978d02","src/read/traits.rs":"c73dd0ca832fc74a9addb414ab5ffe430e6c076a0bd934b31e6608e04c61dc5e","src/read/wasm.rs":"5f6e1e24d53429ac9d80f87e7784183a4608d08b3f465df629c86c68f1af56d4","src/write/coff.rs":"9c9ebc226cb585a61e3c96085099b69de0b2b75877093f644b3caacf03b6d03d","src/write/elf.rs":"00f89e6cb97172a0955dcb47911a31399afe3a6896683a6b937cd370645fc7c0","src/write/macho.rs":"c4344af113700ec944817500711f896f0e6600a5ef4c6d8430ff3a1af20d3f0d","src/write/mod.rs":"ef3037aaf61dab9f3ee1c065c1d78420964711527cfe05e829a0715b3d696efd","src/write/string.rs":"a0640f9e0626ca4618a2ac88e17e0d14b053f880d60635ea932ca78b50a114f5","src/write/util.rs":"9629903d556036aa7d6031cffce1fd38c033453a28c0a30eb34fc77aded4a11d","tests/round_trip.rs":"c385fe01e2c42a20a7eb723617ae3417f82b7d950b2425c821038635462ae073"},"package":"81afbc5773e99efe9533d8a539dfac37e531dcd0f4eeb41584bae03ccf76d4c2"}
\ No newline at end of file
+{"files":{"Cargo.lock":"23339a38e8eddf9001484c2ff7664863025e0eb6c642aba87a5b06c4446c2b81","Cargo.toml":"8e68d4cad051cfed2b1ceb6d208bda6f895ef20ed3244b75aff382f4581151d3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0b74dfa0bcee5c420c6b7f67b4b2658f9ab8388c97b8e733975f2cecbdd668a6","README.md":"5c498b93ff10c038784c5b62c346858c0d53d9d6d1591841c5b6724b0abc9415","examples/nm.rs":"9885cb85700512d63e537b4b60bd2c840aa076721eae2059ba6ae3651be1282e","examples/objcopy.rs":"6b51b89bea2d9bd5d8651942a2a5c5637e4553b8beeda47221470f676f23ede0","examples/objdump.rs":"07a23a2f74b7e46d4cdcf4dab23357a39410b4c4db43179c17e059011e40d45c","src/common.rs":"835207072807c7b7a84c6d52b285cb257480428940def96c951a0ca219db615f","src/lib.rs":"7e559b0af48faca419086a743e3f99794e10a91e8619f8c6e26f113d1935fe14","src/read/any.rs":"f43c2f2285488eb8d7d4b85b393a1c9bb6afdefaafd08dba5b09065fbf079f99","src/read/coff.rs":"f1208d189dfa1b728a6406eea64af8cef19389b70ab1fbd91e94b08bf8cf3d5e","src/read/elf.rs":"93807a74f3122be99cecebe4810d686c27be10df710dbc9751ed2c8d4f4a2acd","src/read/macho.rs":"ca308b21073b9696dd1176b201a0a262eb1f76dd87bc46aee95e30585d06ebae","src/read/mod.rs":"efdb99a566a971bca815e1d1dd85b9e9800fbe4e3572cf54a7b0ff54111469c2","src/read/pe.rs":"cfe0ad92b3ada363519f4cdc8f4cd8fdb2cee25809867ace9e54113e3a4bd36b","src/read/traits.rs":"a091b9e71a464f596d1c8aa3d4b57d1cdd44793a22cfe0c1cae9f2d07e326026","src/read/wasm.rs":"fd693e2f7fe56c23469c40305a1662e0627f35ee2777d470c3e2c670addf159a","src/write/coff.rs":"906593d3b1a6b609c0293edea66c289d2da1a35f7cce79194bac788054d601db","src/write/elf.rs":"ee50be8c85e12d1c42392564b2b44a1b9a78444b3eaf27965ea08c28fef91e5f","src/write/macho.rs":"d26bc671da61997d3b09d1d7895a4e518e45d0dcb85e948341b1c191eb3cb6bd","src/write/mod.rs":"91dfdea43bbfea5617047c9a3af42910de8298e06e472216c3d182ec4fec9b02","src/write/string.rs":"a0640f9e0626ca4618a2ac88e17e0d14b053f880d60635ea932ca78b50a114f5","src/write/util.rs":"9629903d556036aa7d6031cffce1fd38c033453a28c0a30eb34fc77aded4a11d","tests/round_trip.rs":"b101e86d9be1191a64495511fb0709d85d813ca140d3fd0884e72129b8100ea2","tests/tls.rs":"916d701b88a11237829de73a56f22b0b9b75ed4688f92348c32629928f1eaca3"},"package":"a3c61759aa254402e53c79a68dc519cda1ceee2ff2b6d70b3e58bf64ac2f03e3"}
\ No newline at end of file
--- a/third_party/rust/object/Cargo.lock
+++ b/third_party/rust/object/Cargo.lock
@@ -32,66 +32,42 @@ dependencies = [
 name = "crc32fast"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "failure"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "failure_derive"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
 name = "flate2"
 version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
  "miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "goblin"
-version = "0.0.24"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "indexmap"
 version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
-name = "itoa"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
 name = "libc"
 version = "0.2.51"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "log"
 version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -133,154 +109,96 @@ dependencies = [
  "cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
  "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "object"
-version = "0.14.0"
+version = "0.16.0"
 dependencies = [
  "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "goblin 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "indexmap 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "parity-wasm 0.40.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "parity-wasm"
-version = "0.40.0"
+version = "0.41.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "plain"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "proc-macro2"
-version = "0.4.28"
+version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "quote"
-version = "0.6.12"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "rustc_version"
-version = "0.2.3"
+name = "scroll"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "scroll"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "scroll_derive"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "semver"
-version = "0.9.0"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "semver-parser"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde"
-version = "1.0.99"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde_json"
-version = "1.0.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "syn"
-version = "0.15.33"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "target-lexicon"
-version = "0.8.1"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
-]
 
 [[package]]
 name = "unicode-xid"
-version = "0.1.0"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "uuid"
-version = "0.7.4"
+version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "winapi"
 version = "0.3.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -299,40 +217,30 @@ source = "registry+https://github.com/ru
 
 [metadata]
 "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c"
 "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
 "checksum cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)" = "5e5f3fee5eeb60324c2781f1e41286bdee933850fff9b3c672587fed5ec58c83"
 "checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4"
 "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
 "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
-"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
-"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
 "checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa"
-"checksum goblin 0.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "e3fa261d919c1ae9d1e4533c4a2f99e10938603c4208d56c05bec7a872b661b0"
+"checksum goblin 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6040506480da04a63de51a478e8021892d65d8411f29b2a422c2648bdd8bcb"
 "checksum indexmap 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4d6d89e0948bf10c08b9ecc8ac5b83f07f857ebe2c0cbe38de15b4e4f510356"
-"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
 "checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917"
 "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
 "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
 "checksum miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0300eafb20369952951699b68243ab4334f4b10a88f411c221d444b36c40e649"
 "checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e"
 "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab"
-"checksum parity-wasm 0.40.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee68a5b3b7c7f818f982ff75579410b4b8c611d58d623c5bb5c70e9cbb6e16a"
+"checksum parity-wasm 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865"
 "checksum plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
-"checksum proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)" = "ba92c84f814b3f9a44c5cfca7d2ad77fa10710867d2bbb1b3d175ab5f47daa12"
-"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db"
-"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
-"checksum scroll 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f84d114ef17fd144153d608fba7c446b0145d038985e7a8cc5d08bb0ce20383"
-"checksum scroll_derive 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb"
-"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
-"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-"checksum serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)" = "fec2851eb56d010dc9a21b89ca53ee75e6528bab60c11e89d38390904982da9f"
-"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
-"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836"
-"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f"
-"checksum target-lexicon 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7975cb2c6f37d77b190bc5004a2bb015971464756fde9514651a525ada2a741a"
-"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
-"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1"
+"checksum scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28"
+"checksum syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "661641ea2aa15845cddeb97dad000d22070bb5c1fb456b96c1cba883ec691e92"
+"checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+"checksum uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
 "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
 "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
--- a/third_party/rust/object/Cargo.toml
+++ b/third_party/rust/object/Cargo.toml
@@ -8,57 +8,59 @@
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 edition = "2018"
 name = "object"
-version = "0.14.0"
+version = "0.16.0"
 authors = ["Nick Fitzgerald <fitzgen@gmail.com>", "Philip Craig <philipjcraig@gmail.com>"]
 exclude = ["/.coveralls.yml", "/.travis.yml"]
 description = "A unified interface for parsing object file formats."
 keywords = ["object", "loader", "elf", "mach-o", "pe"]
 license = "Apache-2.0/MIT"
 repository = "https://github.com/gimli-rs/object"
+[package.metadata.docs.rs]
+all-features = true
 
 [[example]]
 name = "objcopy"
 required-features = ["read", "write"]
 [dependencies.crc32fast]
-version = "1"
+version = "1.2"
 optional = true
 
 [dependencies.flate2]
 version = "1"
 optional = true
 
 [dependencies.goblin]
-version = "0.0.24"
+version = "0.1"
 features = ["endian_fd", "elf32", "elf64", "mach32", "mach64", "pe32", "pe64", "archive"]
 default-features = false
 
 [dependencies.indexmap]
-version = "1"
+version = "1.1"
 optional = true
 
 [dependencies.parity-wasm]
-version = "0.40.0"
+version = "0.41.0"
 optional = true
 
 [dependencies.scroll]
-version = "0.9"
+version = "0.10"
 default-features = false
 
 [dependencies.target-lexicon]
-version = "0.8"
+version = "0.9"
 
 [dependencies.uuid]
-version = "0.7"
+version = "0.8"
 default-features = false
 [dev-dependencies.memmap]
 version = "0.7"
 
 [features]
 compression = ["flate2"]
 default = ["read", "std", "compression", "wasm"]
 read = []
--- a/third_party/rust/object/src/common.rs
+++ b/third_party/rust/object/src/common.rs
@@ -141,18 +141,27 @@ pub enum RelocationKind {
     /// L + A - P
     PltRelative,
     /// S + A - Image
     ImageOffset,
     /// S + A - Section
     SectionOffset,
     /// The index of the section containing the symbol.
     SectionIndex,
-    /// Some other operation and encoding. The value is dependent on file format and machine.
-    Other(u32),
+    /// Some other ELF relocation. The value is dependent on the architecture.
+    Elf(u32),
+    /// Some other Mach-O relocation. The value is dependent on the architecture.
+    MachO {
+        /// The relocation type.
+        value: u8,
+        /// Whether the relocation is relative to the place.
+        relative: bool,
+    },
+    /// Some other COFF relocation. The value is dependent on the architecture.
+    Coff(u16),
 }
 
 /// Information about how the result of the relocation operation is encoded in the place.
 ///
 /// This is usually architecture specific, such as specifying an addressing mode or
 /// a specific instruction.
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub enum RelocationEncoding {
--- a/third_party/rust/object/src/read/any.rs
+++ b/third_party/rust/object/src/read/any.rs
@@ -314,16 +314,20 @@ impl<'data, 'file> ObjectSegment<'data> 
     fn size(&self) -> u64 {
         with_inner!(self.inner, SegmentInternal, |x| x.size())
     }
 
     fn align(&self) -> u64 {
         with_inner!(self.inner, SegmentInternal, |x| x.align())
     }
 
+    fn file_range(&self) -> (u64, u64) {
+        with_inner!(self.inner, SegmentInternal, |x| x.file_range())
+    }
+
     fn data(&self) -> &'data [u8] {
         with_inner!(self.inner, SegmentInternal, |x| x.data())
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         with_inner!(self.inner, SegmentInternal, |x| x.data_range(address, size))
     }
 
@@ -413,16 +417,20 @@ impl<'data, 'file> ObjectSection<'data> 
     fn size(&self) -> u64 {
         with_inner!(self.inner, SectionInternal, |x| x.size())
     }
 
     fn align(&self) -> u64 {
         with_inner!(self.inner, SectionInternal, |x| x.align())
     }
 
+    fn file_range(&self) -> Option<(u64, u64)> {
+        with_inner!(self.inner, SectionInternal, |x| x.file_range())
+    }
+
     fn data(&self) -> Cow<'data, [u8]> {
         with_inner!(self.inner, SectionInternal, |x| x.data())
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         with_inner!(self.inner, SectionInternal, |x| x.data_range(address, size))
     }
 
--- a/third_party/rust/object/src/read/coff.rs
+++ b/third_party/rust/object/src/read/coff.rs
@@ -229,16 +229,24 @@ impl<'data, 'file> ObjectSegment<'data> 
         u64::from(self.section.virtual_size)
     }
 
     #[inline]
     fn align(&self) -> u64 {
         section_alignment(self.section.characteristics)
     }
 
+    #[inline]
+    fn file_range(&self) -> (u64, u64) {
+        (
+            self.section.pointer_to_raw_data as u64,
+            self.section.size_of_raw_data as u64,
+        )
+    }
+
     fn data(&self) -> &'data [u8] {
         let offset = self.section.pointer_to_raw_data as usize;
         let size = self.section.size_of_raw_data as usize;
         &self.file.data[offset..][..size]
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.data(), self.address(), address, size)
@@ -288,16 +296,24 @@ impl<'data, 'file> ObjectSection<'data> 
         u64::from(self.section.size_of_raw_data)
     }
 
     #[inline]
     fn align(&self) -> u64 {
         section_alignment(self.section.characteristics)
     }
 
+    #[inline]
+    fn file_range(&self) -> Option<(u64, u64)> {
+        Some((
+            self.section.pointer_to_raw_data as u64,
+            self.section.size_of_raw_data as u64,
+        ))
+    }
+
     fn data(&self) -> Cow<'data, [u8]> {
         Cow::from(self.raw_data())
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.raw_data(), self.address(), address, size)
     }
 
@@ -455,17 +471,17 @@ impl<'data, 'file> Iterator for CoffRelo
                     pe::relocation::IMAGE_REL_I386_DIR16 => (RelocationKind::Absolute, 16, 0),
                     pe::relocation::IMAGE_REL_I386_REL16 => (RelocationKind::Relative, 16, 0),
                     pe::relocation::IMAGE_REL_I386_DIR32 => (RelocationKind::Absolute, 32, 0),
                     pe::relocation::IMAGE_REL_I386_DIR32NB => (RelocationKind::ImageOffset, 32, 0),
                     pe::relocation::IMAGE_REL_I386_SECTION => (RelocationKind::SectionIndex, 16, 0),
                     pe::relocation::IMAGE_REL_I386_SECREL => (RelocationKind::SectionOffset, 32, 0),
                     pe::relocation::IMAGE_REL_I386_SECREL7 => (RelocationKind::SectionOffset, 7, 0),
                     pe::relocation::IMAGE_REL_I386_REL32 => (RelocationKind::Relative, 32, -4),
-                    _ => (RelocationKind::Other(u32::from(relocation.typ)), 0, 0),
+                    _ => (RelocationKind::Coff(relocation.typ), 0, 0),
                 },
                 pe::header::COFF_MACHINE_X86_64 => match relocation.typ {
                     pe::relocation::IMAGE_REL_AMD64_ADDR64 => (RelocationKind::Absolute, 64, 0),
                     pe::relocation::IMAGE_REL_AMD64_ADDR32 => (RelocationKind::Absolute, 32, 0),
                     pe::relocation::IMAGE_REL_AMD64_ADDR32NB => {
                         (RelocationKind::ImageOffset, 32, 0)
                     }
                     pe::relocation::IMAGE_REL_AMD64_REL32 => (RelocationKind::Relative, 32, -4),
@@ -478,19 +494,19 @@ impl<'data, 'file> Iterator for CoffRelo
                         (RelocationKind::SectionIndex, 16, 0)
                     }
                     pe::relocation::IMAGE_REL_AMD64_SECREL => {
                         (RelocationKind::SectionOffset, 32, 0)
                     }
                     pe::relocation::IMAGE_REL_AMD64_SECREL7 => {
                         (RelocationKind::SectionOffset, 7, 0)
                     }
-                    _ => (RelocationKind::Other(u32::from(relocation.typ)), 0, 0),
+                    _ => (RelocationKind::Coff(relocation.typ), 0, 0),
                 },
-                _ => (RelocationKind::Other(u32::from(relocation.typ)), 0, 0),
+                _ => (RelocationKind::Coff(relocation.typ), 0, 0),
             };
             let target =
                 RelocationTarget::Symbol(SymbolIndex(relocation.symbol_table_index as usize));
             (
                 u64::from(relocation.virtual_address),
                 Relocation {
                     kind,
                     encoding: RelocationEncoding::Generic,
--- a/third_party/rust/object/src/read/elf.rs
+++ b/third_party/rust/object/src/read/elf.rs
@@ -273,16 +273,21 @@ impl<'data, 'file> ObjectSegment<'data> 
         self.segment.p_memsz
     }
 
     #[inline]
     fn align(&self) -> u64 {
         self.segment.p_align
     }
 
+    #[inline]
+    fn file_range(&self) -> (u64, u64) {
+        (self.segment.p_offset, self.segment.p_filesz)
+    }
+
     fn data(&self) -> &'data [u8] {
         &self.file.data[self.segment.p_offset as usize..][..self.segment.p_filesz as usize]
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.data(), self.address(), address, size)
     }
 
@@ -321,21 +326,29 @@ where
     'data: 'file,
 {
     file: &'file ElfFile<'data>,
     index: SectionIndex,
     section: &'file elf::SectionHeader,
 }
 
 impl<'data, 'file> ElfSection<'data, 'file> {
+    fn raw_offset(&self) -> Option<(u64, u64)> {
+        if self.section.sh_type == elf::section_header::SHT_NOBITS {
+            None
+        } else {
+            Some((self.section.sh_offset, self.section.sh_size))
+        }
+    }
+
     fn raw_data(&self) -> &'data [u8] {
-        if self.section.sh_type == elf::section_header::SHT_NOBITS {
+        if let Some((offset, size)) = self.raw_offset() {
+            &self.file.data[offset as usize..][..size as usize]
+        } else {
             &[]
-        } else {
-            &self.file.data[self.section.sh_offset as usize..][..self.section.sh_size as usize]
         }
     }
 
     #[cfg(feature = "compression")]
     fn maybe_decompress_data(&self) -> Option<Cow<'data, [u8]>> {
         if (self.section.sh_flags & u64::from(elf::section_header::SHF_COMPRESSED)) == 0 {
             return None;
         }
@@ -419,16 +432,21 @@ impl<'data, 'file> ObjectSection<'data> 
     }
 
     #[inline]
     fn align(&self) -> u64 {
         self.section.sh_addralign
     }
 
     #[inline]
+    fn file_range(&self) -> Option<(u64, u64)> {
+        self.raw_offset()
+    }
+
+    #[inline]
     fn data(&self) -> Cow<'data, [u8]> {
         Cow::from(self.raw_data())
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.raw_data(), self.address(), address, size)
     }
 
@@ -608,58 +626,58 @@ impl<'data, 'file> Iterator for ElfReloc
     fn next(&mut self) -> Option<Self::Item> {
         loop {
             if let Some(ref mut relocations) = self.relocations {
                 if let Some(reloc) = relocations.next() {
                     let mut encoding = RelocationEncoding::Generic;
                     let (kind, size) = match self.file.elf.header.e_machine {
                         elf::header::EM_ARM => match reloc.r_type {
                             elf::reloc::R_ARM_ABS32 => (RelocationKind::Absolute, 32),
-                            _ => (RelocationKind::Other(reloc.r_type), 0),
+                            _ => (RelocationKind::Elf(reloc.r_type), 0),
                         },
                         elf::header::EM_AARCH64 => match reloc.r_type {
                             elf::reloc::R_AARCH64_ABS64 => (RelocationKind::Absolute, 64),
                             elf::reloc::R_AARCH64_ABS32 => (RelocationKind::Absolute, 32),
                             elf::reloc::R_AARCH64_ABS16 => (RelocationKind::Absolute, 16),
                             elf::reloc::R_AARCH64_PREL64 => (RelocationKind::Relative, 64),
                             elf::reloc::R_AARCH64_PREL32 => (RelocationKind::Relative, 32),
                             elf::reloc::R_AARCH64_PREL16 => (RelocationKind::Relative, 16),
-                            _ => (RelocationKind::Other(reloc.r_type), 0),
+                            _ => (RelocationKind::Elf(reloc.r_type), 0),
                         },
                         elf::header::EM_386 => match reloc.r_type {
                             elf::reloc::R_386_32 => (RelocationKind::Absolute, 32),
                             elf::reloc::R_386_PC32 => (RelocationKind::Relative, 32),
                             elf::reloc::R_386_GOT32 => (RelocationKind::Got, 32),
                             elf::reloc::R_386_PLT32 => (RelocationKind::PltRelative, 32),
                             elf::reloc::R_386_GOTOFF => (RelocationKind::GotBaseOffset, 32),
                             elf::reloc::R_386_GOTPC => (RelocationKind::GotBaseRelative, 32),
                             elf::reloc::R_386_16 => (RelocationKind::Absolute, 16),
                             elf::reloc::R_386_PC16 => (RelocationKind::Relative, 16),
                             elf::reloc::R_386_8 => (RelocationKind::Absolute, 8),
                             elf::reloc::R_386_PC8 => (RelocationKind::Relative, 8),
-                            _ => (RelocationKind::Other(reloc.r_type), 0),
+                            _ => (RelocationKind::Elf(reloc.r_type), 0),
                         },
                         elf::header::EM_X86_64 => match reloc.r_type {
                             elf::reloc::R_X86_64_64 => (RelocationKind::Absolute, 64),
                             elf::reloc::R_X86_64_PC32 => (RelocationKind::Relative, 32),
                             elf::reloc::R_X86_64_GOT32 => (RelocationKind::Got, 32),
                             elf::reloc::R_X86_64_PLT32 => (RelocationKind::PltRelative, 32),
                             elf::reloc::R_X86_64_GOTPCREL => (RelocationKind::GotRelative, 32),
                             elf::reloc::R_X86_64_32 => (RelocationKind::Absolute, 32),
                             elf::reloc::R_X86_64_32S => {
                                 encoding = RelocationEncoding::X86Signed;
                                 (RelocationKind::Absolute, 32)
                             }
                             elf::reloc::R_X86_64_16 => (RelocationKind::Absolute, 16),
                             elf::reloc::R_X86_64_PC16 => (RelocationKind::Relative, 16),
                             elf::reloc::R_X86_64_8 => (RelocationKind::Absolute, 8),
                             elf::reloc::R_X86_64_PC8 => (RelocationKind::Relative, 8),
-                            _ => (RelocationKind::Other(reloc.r_type), 0),
+                            _ => (RelocationKind::Elf(reloc.r_type), 0),
                         },
-                        _ => (RelocationKind::Other(reloc.r_type), 0),
+                        _ => (RelocationKind::Elf(reloc.r_type), 0),
                     };
                     let target = RelocationTarget::Symbol(SymbolIndex(reloc.r_sym as usize));
                     return Some((
                         reloc.r_offset,
                         Relocation {
                             kind,
                             encoding,
                             size,
--- a/third_party/rust/object/src/read/macho.rs
+++ b/third_party/rust/object/src/read/macho.rs
@@ -268,16 +268,21 @@ impl<'data, 'file> ObjectSegment<'data> 
 
     #[inline]
     fn align(&self) -> u64 {
         // Page size.
         0x1000
     }
 
     #[inline]
+    fn file_range(&self) -> (u64, u64) {
+        (self.segment.fileoff, self.segment.filesize)
+    }
+
+    #[inline]
     fn data(&self) -> &'data [u8] {
         self.segment.data
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.data(), self.address(), address, size)
     }
 
@@ -351,16 +356,22 @@ impl<'data, 'file> ObjectSection<'data> 
     }
 
     #[inline]
     fn align(&self) -> u64 {
         1 << self.internal().section.align
     }
 
     #[inline]
+    fn file_range(&self) -> Option<(u64, u64)> {
+        let internal = &self.internal().section;
+        Some((internal.offset as u64, internal.size))
+    }
+
+    #[inline]
     fn data(&self) -> Cow<'data, [u8]> {
         Cow::from(self.internal().data)
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.internal().data, self.address(), address, size)
     }
 
@@ -526,44 +537,59 @@ impl<'data, 'file> Iterator for MachORel
     type Item = (u64, Relocation);
 
     fn next(&mut self) -> Option<Self::Item> {
         self.relocations.next()?.ok().map(|reloc| {
             let mut encoding = RelocationEncoding::Generic;
             let kind = match self.file.macho.header.cputype {
                 mach::cputype::CPU_TYPE_ARM => match (reloc.r_type(), reloc.r_pcrel()) {
                     (mach::relocation::ARM_RELOC_VANILLA, 0) => RelocationKind::Absolute,
-                    _ => RelocationKind::Other(reloc.r_info),
+                    _ => RelocationKind::MachO {
+                        value: reloc.r_type(),
+                        relative: reloc.is_pic(),
+                    },
                 },
                 mach::cputype::CPU_TYPE_ARM64 => match (reloc.r_type(), reloc.r_pcrel()) {
                     (mach::relocation::ARM64_RELOC_UNSIGNED, 0) => RelocationKind::Absolute,
-                    _ => RelocationKind::Other(reloc.r_info),
+                    _ => RelocationKind::MachO {
+                        value: reloc.r_type(),
+                        relative: reloc.is_pic(),
+                    },
                 },
                 mach::cputype::CPU_TYPE_X86 => match (reloc.r_type(), reloc.r_pcrel()) {
                     (mach::relocation::GENERIC_RELOC_VANILLA, 0) => RelocationKind::Absolute,
-                    _ => RelocationKind::Other(reloc.r_info),
+                    _ => RelocationKind::MachO {
+                        value: reloc.r_type(),
+                        relative: reloc.is_pic(),
+                    },
                 },
                 mach::cputype::CPU_TYPE_X86_64 => match (reloc.r_type(), reloc.r_pcrel()) {
                     (mach::relocation::X86_64_RELOC_UNSIGNED, 0) => RelocationKind::Absolute,
                     (mach::relocation::X86_64_RELOC_SIGNED, 1) => {
                         encoding = RelocationEncoding::X86RipRelative;
                         RelocationKind::Relative
                     }
                     (mach::relocation::X86_64_RELOC_BRANCH, 1) => {
                         encoding = RelocationEncoding::X86Branch;
                         RelocationKind::Relative
                     }
                     (mach::relocation::X86_64_RELOC_GOT, 1) => RelocationKind::GotRelative,
                     (mach::relocation::X86_64_RELOC_GOT_LOAD, 1) => {
                         encoding = RelocationEncoding::X86RipRelativeMovq;
                         RelocationKind::GotRelative
                     }
-                    _ => RelocationKind::Other(reloc.r_info),
+                    _ => RelocationKind::MachO {
+                        value: reloc.r_type(),
+                        relative: reloc.is_pic(),
+                    },
                 },
-                _ => RelocationKind::Other(reloc.r_info),
+                _ => RelocationKind::MachO {
+                    value: reloc.r_type(),
+                    relative: reloc.is_pic(),
+                },
             };
             let size = 8 << reloc.r_length();
             let target = if reloc.is_extern() {
                 RelocationTarget::Symbol(SymbolIndex(reloc.r_symbolnum()))
             } else {
                 RelocationTarget::Section(SectionIndex(reloc.r_symbolnum()))
             };
             let addend = if reloc.r_pcrel() != 0 { -4 } else { 0 };
--- a/third_party/rust/object/src/read/pe.rs
+++ b/third_party/rust/object/src/read/pe.rs
@@ -187,16 +187,24 @@ impl<'data, 'file> ObjectSegment<'data> 
         u64::from(self.section.virtual_size)
     }
 
     #[inline]
     fn align(&self) -> u64 {
         self.file.section_alignment()
     }
 
+    #[inline]
+    fn file_range(&self) -> (u64, u64) {
+        (
+            self.section.pointer_to_raw_data as u64,
+            self.section.size_of_raw_data as u64,
+        )
+    }
+
     fn data(&self) -> &'data [u8] {
         let offset = self.section.pointer_to_raw_data as usize;
         let size = cmp::min(self.section.virtual_size, self.section.size_of_raw_data) as usize;
         &self.file.data[offset..][..size]
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.data(), self.address(), address, size)
@@ -267,16 +275,24 @@ impl<'data, 'file> ObjectSection<'data> 
         u64::from(self.section.virtual_size)
     }
 
     #[inline]
     fn align(&self) -> u64 {
         self.file.section_alignment()
     }
 
+    #[inline]
+    fn file_range(&self) -> Option<(u64, u64)> {
+        Some((
+            self.section.pointer_to_raw_data as u64,
+            self.section.size_of_raw_data as u64,
+        ))
+    }
+
     fn data(&self) -> Cow<'data, [u8]> {
         Cow::from(self.raw_data())
     }
 
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]> {
         read::data_range(self.raw_data(), self.address(), address, size)
     }
 
--- a/third_party/rust/object/src/read/traits.rs
+++ b/third_party/rust/object/src/read/traits.rs
@@ -146,16 +146,19 @@ pub trait ObjectSegment<'data> {
     fn address(&self) -> u64;
 
     /// Returns the size of the segment in memory.
     fn size(&self) -> u64;
 
     /// Returns the alignment of the segment in memory.
     fn align(&self) -> u64;
 
+    /// Returns the offset and size of the segment in the file.
+    fn file_range(&self) -> (u64, u64);
+
     /// Returns a reference to the file contents of the segment.
     /// The length of this data may be different from the size of the
     /// segment in memory.
     fn data(&self) -> &'data [u8];
 
     /// Return the segment data in the given range.
     fn data_range(&self, address: u64, size: u64) -> Option<&'data [u8]>;
 
@@ -178,16 +181,19 @@ pub trait ObjectSection<'data> {
     fn address(&self) -> u64;
 
     /// Returns the size of the section in memory.
     fn size(&self) -> u64;
 
     /// Returns the alignment of the section in memory.
     fn align(&self) -> u64;
 
+    /// Returns offset and size of on-disk segment (if any)
+    fn file_range(&self) -> Option<(u64, u64)>;
+
     /// Returns the raw contents of the section.
     /// The length of this data may be different from the size of the
     /// section in memory.
     ///
     /// This does not do any decompression.
     fn data(&self) -> Cow<'data, [u8]>;
 
     /// Return the raw contents of the section data in the given range.
--- a/third_party/rust/object/src/read/wasm.rs
+++ b/third_party/rust/object/src/read/wasm.rs
@@ -139,16 +139,21 @@ impl<'file> ObjectSegment<'static> for W
         unreachable!()
     }
 
     #[inline]
     fn align(&self) -> u64 {
         unreachable!()
     }
 
+    #[inline]
+    fn file_range(&self) -> (u64, u64) {
+        unreachable!()
+    }
+
     fn data(&self) -> &'static [u8] {
         unreachable!()
     }
 
     fn data_range(&self, _address: u64, _size: u64) -> Option<&'static [u8]> {
         unreachable!()
     }
 
@@ -200,16 +205,21 @@ impl<'file> ObjectSection<'static> for W
         serialize_to_cow(self.section.clone()).map_or(0, |b| b.len() as u64)
     }
 
     #[inline]
     fn align(&self) -> u64 {
         1
     }
 
+    #[inline]
+    fn file_range(&self) -> Option<(u64, u64)> {
+        None
+    }
+
     fn data(&self) -> Cow<'static, [u8]> {
         match *self.section {
             elements::Section::Custom(ref section) => Some(section.payload().to_vec().into()),
             elements::Section::Start(section) => {
                 serialize_to_cow(elements::VarUint32::from(section))
             }
             _ => serialize_to_cow(self.section.clone()),
         }
--- a/third_party/rust/object/src/write/coff.rs
+++ b/third_party/rust/object/src/write/coff.rs
@@ -40,16 +40,25 @@ impl Object {
             StandardSection::Text => (&[], &b".text"[..], SectionKind::Text),
             StandardSection::Data => (&[], &b".data"[..], SectionKind::Data),
             StandardSection::ReadOnlyData
             | StandardSection::ReadOnlyDataWithRel
             | StandardSection::ReadOnlyString => (&[], &b".rdata"[..], SectionKind::ReadOnlyData),
             StandardSection::UninitializedData => {
                 (&[], &b".bss"[..], SectionKind::UninitializedData)
             }
+            StandardSection::Tls => (&[], &b".tls$"[..], SectionKind::Tls),
+            StandardSection::UninitializedTls => {
+                // Unsupported section.
+                (&[], &[], SectionKind::UninitializedTls)
+            }
+            StandardSection::TlsVariables => {
+                // Unsupported section.
+                (&[], &[], SectionKind::TlsVariables)
+            }
         }
     }
 
     pub(crate) fn coff_subsection_name(&self, section: &[u8], value: &[u8]) -> Vec<u8> {
         let mut name = section.to_vec();
         name.push(b'$');
         name.extend(value);
         name
@@ -111,17 +120,17 @@ impl Object {
             kind: RelocationKind::Absolute,
             encoding: RelocationEncoding::Generic,
             symbol: symbol_id,
             addend: 0,
         }];
 
         let mut name = b".refptr.".to_vec();
         name.extend(&self.symbol(symbol_id).name);
-        let stub_id = self.add_symbol(Symbol {
+        let stub_id = self.add_raw_symbol(Symbol {
             name,
             value: 0,
             size: u64::from(stub_size),
             kind: SymbolKind::Data,
             scope: SymbolScope::Compilation,
             weak: false,
             section: Some(section_id),
         });
@@ -332,32 +341,32 @@ impl Object {
                             (RelocationKind::Absolute, 16, 0) => coff::IMAGE_REL_I386_DIR16,
                             (RelocationKind::Relative, 16, 0) => coff::IMAGE_REL_I386_REL16,
                             (RelocationKind::Absolute, 32, 0) => coff::IMAGE_REL_I386_DIR32,
                             (RelocationKind::ImageOffset, 32, 0) => coff::IMAGE_REL_I386_DIR32NB,
                             (RelocationKind::SectionIndex, 16, 0) => coff::IMAGE_REL_I386_SECTION,
                             (RelocationKind::SectionOffset, 32, 0) => coff::IMAGE_REL_I386_SECREL,
                             (RelocationKind::SectionOffset, 7, 0) => coff::IMAGE_REL_I386_SECREL7,
                             (RelocationKind::Relative, 32, -4) => coff::IMAGE_REL_I386_REL32,
-                            (RelocationKind::Other(x), _, _) => x as u16,
+                            (RelocationKind::Coff(x), _, _) => x,
                             _ => return Err(format!("unimplemented relocation {:?}", reloc)),
                         },
                         Architecture::X86_64 => match (reloc.kind, reloc.size, reloc.addend) {
                             (RelocationKind::Absolute, 64, 0) => coff::IMAGE_REL_AMD64_ADDR64,
                             (RelocationKind::Absolute, 32, 0) => coff::IMAGE_REL_AMD64_ADDR32,
                             (RelocationKind::ImageOffset, 32, 0) => coff::IMAGE_REL_AMD64_ADDR32NB,
                             (RelocationKind::Relative, 32, -4) => coff::IMAGE_REL_AMD64_REL32,
                             (RelocationKind::Relative, 32, -5) => coff::IMAGE_REL_AMD64_REL32_1,
                             (RelocationKind::Relative, 32, -6) => coff::IMAGE_REL_AMD64_REL32_2,
                             (RelocationKind::Relative, 32, -7) => coff::IMAGE_REL_AMD64_REL32_3,
                             (RelocationKind::Relative, 32, -8) => coff::IMAGE_REL_AMD64_REL32_4,
                             (RelocationKind::Relative, 32, -9) => coff::IMAGE_REL_AMD64_REL32_5,
                             (RelocationKind::SectionOffset, 32, 0) => coff::IMAGE_REL_AMD64_SECREL,
                             (RelocationKind::SectionOffset, 7, 0) => coff::IMAGE_REL_AMD64_SECREL7,
-                            (RelocationKind::Other(x), _, _) => x as u16,
+                            (RelocationKind::Coff(x), _, _) => x,
                             _ => return Err(format!("unimplemented relocation {:?}", reloc)),
                         },
                         _ => {
                             return Err(format!(
                                 "unimplemented architecture {:?}",
                                 self.architecture
                             ))
                         }
--- a/third_party/rust/object/src/write/elf.rs
+++ b/third_party/rust/object/src/write/elf.rs
@@ -41,16 +41,24 @@ impl Object {
             StandardSection::Text => (&[], &b".text"[..], SectionKind::Text),
             StandardSection::Data => (&[], &b".data"[..], SectionKind::Data),
             StandardSection::ReadOnlyData
             | StandardSection::ReadOnlyDataWithRel
             | StandardSection::ReadOnlyString => (&[], &b".rodata"[..], SectionKind::ReadOnlyData),
             StandardSection::UninitializedData => {
                 (&[], &b".bss"[..], SectionKind::UninitializedData)
             }
+            StandardSection::Tls => (&[], &b".tdata"[..], SectionKind::Tls),
+            StandardSection::UninitializedTls => {
+                (&[], &b".tbss"[..], SectionKind::UninitializedTls)
+            }
+            StandardSection::TlsVariables => {
+                // Unsupported section.
+                (&[], &[], SectionKind::TlsVariables)
+            }
         }
     }
 
     pub(crate) fn elf_subsection_name(&self, section: &[u8], value: &[u8]) -> Vec<u8> {
         let mut name = section.to_vec();
         name.push(b'.');
         name.extend(value);
         name
@@ -87,17 +95,17 @@ impl Object {
             }
             match relocation.kind {
                 // Anything using GOT or PLT is preemptible.
                 // We also require that `Other` relocations must already be correct.
                 RelocationKind::Got
                 | RelocationKind::GotRelative
                 | RelocationKind::GotBaseRelative
                 | RelocationKind::PltRelative
-                | RelocationKind::Other(_) => return false,
+                | RelocationKind::Elf(_) => return false,
                 // Absolute relocations are preemptible for non-local data.
                 // TODO: not sure if this rule is exactly correct
                 // This rule was added to handle global data references in debuginfo.
                 // Maybe this should be a new relocation kind so that the caller can decide.
                 RelocationKind::Absolute => {
                     if symbol.kind == SymbolKind::Data {
                         return false;
                     }
@@ -485,17 +493,17 @@ impl Object {
                             (RelocationKind::Got, 32) => elf::R_386_GOT32,
                             (RelocationKind::PltRelative, 32) => elf::R_386_PLT32,
                             (RelocationKind::GotBaseOffset, 32) => elf::R_386_GOTOFF,
                             (RelocationKind::GotBaseRelative, 32) => elf::R_386_GOTPC,
                             (RelocationKind::Absolute, 16) => elf::R_386_16,
                             (RelocationKind::Relative, 16) => elf::R_386_PC16,
                             (RelocationKind::Absolute, 8) => elf::R_386_8,
                             (RelocationKind::Relative, 8) => elf::R_386_PC8,
-                            (RelocationKind::Other(x), _) => x,
+                            (RelocationKind::Elf(x), _) => x,
                             _ => return Err(format!("unimplemented relocation {:?}", reloc)),
                         },
                         Architecture::X86_64 => match (reloc.kind, reloc.encoding, reloc.size) {
                             (RelocationKind::Absolute, RelocationEncoding::Generic, 64) => {
                                 elf::R_X86_64_64
                             }
                             (RelocationKind::Relative, _, 32) => elf::R_X86_64_PC32,
                             (RelocationKind::Got, _, 32) => elf::R_X86_64_GOT32,
@@ -506,17 +514,17 @@ impl Object {
                             }
                             (RelocationKind::Absolute, RelocationEncoding::X86Signed, 32) => {
                                 elf::R_X86_64_32S
                             }
                             (RelocationKind::Absolute, _, 16) => elf::R_X86_64_16,
                             (RelocationKind::Relative, _, 16) => elf::R_X86_64_PC16,
                             (RelocationKind::Absolute, _, 8) => elf::R_X86_64_8,
                             (RelocationKind::Relative, _, 8) => elf::R_X86_64_PC8,
-                            (RelocationKind::Other(x), _, _) => x,
+                            (RelocationKind::Elf(x), _, _) => x,
                             _ => return Err(format!("unimplemented relocation {:?}", reloc)),
                         },
                         _ => {
                             return Err(format!(
                                 "unimplemented architecture {:?}",
                                 self.architecture
                             ))
                         }
--- a/third_party/rust/object/src/write/macho.rs
+++ b/third_party/rust/object/src/write/macho.rs
@@ -58,19 +58,122 @@ impl Object {
                 &b"__cstring"[..],
                 SectionKind::ReadOnlyString,
             ),
             StandardSection::UninitializedData => (
                 &b"__DATA"[..],
                 &b"__bss"[..],
                 SectionKind::UninitializedData,
             ),
+            StandardSection::Tls => (&b"__DATA"[..], &b"__thread_data"[..], SectionKind::Tls),
+            StandardSection::UninitializedTls => (
+                &b"__DATA"[..],
+                &b"__thread_bss"[..],
+                SectionKind::UninitializedTls,
+            ),
+            StandardSection::TlsVariables => (
+                &b"__DATA"[..],
+                &b"__thread_vars"[..],
+                SectionKind::TlsVariables,
+            ),
         }
     }
 
+    fn macho_tlv_bootstrap(&mut self) -> SymbolId {
+        match self.tlv_bootstrap {
+            Some(id) => id,
+            None => {
+                let id = self.add_symbol(Symbol {
+                    name: b"_tlv_bootstrap".to_vec(),
+                    value: 0,
+                    size: 0,
+                    kind: SymbolKind::Text,
+                    scope: SymbolScope::Dynamic,
+                    weak: false,
+                    section: None,
+                });
+                self.tlv_bootstrap = Some(id);
+                id
+            }
+        }
+    }
+
+    /// Create the `__thread_vars` entry for a TLS variable.
+    ///
+    /// The symbol given by `symbol_id` will be updated to point to this entry.
+    ///
+    /// A new `SymbolId` will be returned. The caller must update this symbol
+    /// to point to the initializer.
+    ///
+    /// If `symbol_id` is not for a TLS variable, then it is returned unchanged.
+    pub(crate) fn macho_add_thread_var(&mut self, symbol_id: SymbolId) -> SymbolId {
+        let symbol = self.symbol_mut(symbol_id);
+        if symbol.kind != SymbolKind::Tls {
+            return symbol_id;
+        }
+
+        // Create the initializer symbol.
+        let mut name = symbol.name.clone();
+        name.extend(b"$tlv$init");
+        let init_symbol_id = self.add_raw_symbol(Symbol {
+            name,
+            value: 0,
+            size: 0,
+            kind: SymbolKind::Tls,
+            scope: SymbolScope::Compilation,
+            weak: false,
+            section: None,
+        });
+
+        // Add the tlv entry.
+        // Three pointers in size:
+        //   - __tlv_bootstrap - used to make sure support exists
+        //   - spare pointer - used when mapped by the runtime
+        //   - pointer to symbol initializer
+        let section = self.section_id(StandardSection::TlsVariables);
+        let pointer_width = self.architecture.pointer_width().unwrap().bytes();
+        let size = u64::from(pointer_width) * 3;
+        let data = vec![0; size as usize];
+        let offset = self.append_section_data(section, &data, u64::from(pointer_width));
+
+        let tlv_bootstrap = self.macho_tlv_bootstrap();
+        self.add_relocation(
+            section,
+            Relocation {
+                offset: offset,
+                size: pointer_width * 8,
+                kind: RelocationKind::Absolute,
+                encoding: RelocationEncoding::Generic,
+                symbol: tlv_bootstrap,
+                addend: 0,
+            },
+        )
+        .unwrap();
+        self.add_relocation(
+            section,
+            Relocation {
+                offset: offset + u64::from(pointer_width) * 2,
+                size: pointer_width * 8,
+                kind: RelocationKind::Absolute,
+                encoding: RelocationEncoding::Generic,
+                symbol: init_symbol_id,
+                addend: 0,
+            },
+        )
+        .unwrap();
+
+        // Update the symbol to point to the tlv.
+        let symbol = self.symbol_mut(symbol_id);
+        symbol.value = offset;
+        symbol.size = size;
+        symbol.section = Some(section);
+
+        init_symbol_id
+    }
+
     pub(crate) fn macho_fixup_relocation(&mut self, mut relocation: &mut Relocation) -> i64 {
         let constant = match relocation.kind {
             RelocationKind::Relative
             | RelocationKind::GotRelative
             | RelocationKind::PltRelative => relocation.addend + 4,
             _ => relocation.addend,
         };
         relocation.addend -= constant;
@@ -135,17 +238,17 @@ impl Object {
 
         // Count symbols and add symbol strings to strtab.
         let mut strtab = StringTable::default();
         let mut symbol_offsets = vec![SymbolOffsets::default(); self.symbols.len()];
         let mut nsyms = 0;
         for (index, symbol) in self.symbols.iter().enumerate() {
             if !symbol.is_undefined() {
                 match symbol.kind {
-                    SymbolKind::Text | SymbolKind::Data => {}
+                    SymbolKind::Text | SymbolKind::Data | SymbolKind::Tls => {}
                     SymbolKind::File | SymbolKind::Section => continue,
                     _ => return Err(format!("unimplemented symbol {:?}", symbol)),
                 }
             }
             symbol_offsets[index].index = nsyms;
             nsyms += 1;
             if !symbol.name.is_empty() {
                 symbol_offsets[index].str_id = Some(strtab.add(&symbol.name));
@@ -304,17 +407,17 @@ impl Object {
         }
 
         // Write symtab.
         write_align(&mut buffer, pointer_align);
         debug_assert_eq!(symtab_offset, buffer.len());
         for (index, symbol) in self.symbols.iter().enumerate() {
             if !symbol.is_undefined() {
                 match symbol.kind {
-                    SymbolKind::Text | SymbolKind::Data => {}
+                    SymbolKind::Text | SymbolKind::Data | SymbolKind::Tls => {}
                     SymbolKind::File | SymbolKind::Section => continue,
                     _ => return Err(format!("unimplemented symbol {:?}", symbol)),
                 }
             }
             // TODO: N_STAB
             // TODO: N_ABS
             let mut n_type = if symbol.is_undefined() {
                 mach::N_UNDF | mach::N_EXT
@@ -415,16 +518,19 @@ impl Object {
                             (RelocationKind::GotRelative, RelocationEncoding::Generic, -4) => {
                                 (1, mach::X86_64_RELOC_GOT)
                             }
                             (
                                 RelocationKind::GotRelative,
                                 RelocationEncoding::X86RipRelativeMovq,
                                 -4,
                             ) => (1, mach::X86_64_RELOC_GOT_LOAD),
+                            (RelocationKind::MachO { value, relative }, _, _) => {
+                                (u32::from(relative), value)
+                            }
                             _ => return Err(format!("unimplemented relocation {:?}", reloc)),
                         },
                         _ => {
                             return Err(format!(
                                 "unimplemented architecture {:?}",
                                 self.architecture
                             ))
                         }
--- a/third_party/rust/object/src/write/mod.rs
+++ b/third_party/rust/object/src/write/mod.rs
@@ -26,31 +26,34 @@ pub struct Object {
     sections: Vec<Section>,
     standard_sections: HashMap<StandardSection, SectionId>,
     symbols: Vec<Symbol>,
     symbol_map: HashMap<Vec<u8>, SymbolId>,
     stub_symbols: HashMap<SymbolId, SymbolId>,
     subsection_via_symbols: bool,
     /// The symbol name mangling scheme.
     pub mangling: Mangling,
+    /// Mach-O "_tlv_bootstrap" symbol.
+    tlv_bootstrap: Option<SymbolId>,
 }
 
 impl Object {
     /// Create an empty object file.
     pub fn new(format: BinaryFormat, architecture: Architecture) -> Object {
         Object {
             format,
             architecture,
             sections: Vec::new(),
             standard_sections: HashMap::new(),
             symbols: Vec::new(),
             symbol_map: HashMap::new(),
             stub_symbols: HashMap::new(),
             subsection_via_symbols: false,
             mangling: Mangling::default(format, architecture),
+            tlv_bootstrap: None,
         }
     }
 
     /// Return the file format.
     #[inline]
     pub fn format(&self) -> BinaryFormat {
         self.format
     }
@@ -226,32 +229,47 @@ impl Object {
 
     /// Add a new symbol and return its `SymbolId`.
     pub fn add_symbol(&mut self, mut symbol: Symbol) -> SymbolId {
         // Defined symbols must have a scope.
         debug_assert!(symbol.is_undefined() || symbol.scope != SymbolScope::Unknown);
         if symbol.kind == SymbolKind::Section {
             return self.section_symbol(symbol.section.unwrap());
         }
-        let symbol_id = SymbolId(self.symbols.len());
         if !symbol.name.is_empty()
-            && (symbol.kind == SymbolKind::Text || symbol.kind == SymbolKind::Data)
+            && (symbol.kind == SymbolKind::Text
+                || symbol.kind == SymbolKind::Data
+                || symbol.kind == SymbolKind::Tls)
         {
-            self.symbol_map.insert(symbol.name.clone(), symbol_id);
+            let unmangled_name = symbol.name.clone();
             if let Some(prefix) = self.mangling.global_prefix() {
                 symbol.name.insert(0, prefix);
             }
+            let symbol_id = self.add_raw_symbol(symbol);
+            self.symbol_map.insert(unmangled_name, symbol_id);
+            symbol_id
+        } else {
+            self.add_raw_symbol(symbol)
         }
+    }
+
+    fn add_raw_symbol(&mut self, symbol: Symbol) -> SymbolId {
+        let symbol_id = SymbolId(self.symbols.len());
         self.symbols.push(symbol);
         symbol_id
     }
 
+    /// Return true if the file format supports `StandardSection::UninitializedTls`.
+    pub fn has_uninitialized_tls(&self) -> bool {
+        self.format != BinaryFormat::Coff
+    }
+
     /// Add a new file symbol and return its `SymbolId`.
     pub fn add_file_symbol(&mut self, name: Vec<u8>) -> SymbolId {
-        self.add_symbol(Symbol {
+        self.add_raw_symbol(Symbol {
             name,
             value: 0,
             size: 0,
             kind: SymbolKind::File,
             scope: SymbolScope::Compilation,
             weak: false,
             section: None,
         })
@@ -279,30 +297,87 @@ impl Object {
             section: Some(section_id),
         });
         section.symbol = Some(symbol_id);
         symbol_id
     }
 
     /// Append data to an existing section, and update a symbol to refer to it.
     ///
+    /// For Mach-O, this also creates a `__thread_vars` entry for TLS symbols, and the
+    /// symbol will indirectly point to the added data via the `__thread_vars` entry.
+    ///
     /// Returns the section offset of the data.
     pub fn add_symbol_data(
         &mut self,
-        symbol: SymbolId,
+        symbol_id: SymbolId,
         section: SectionId,
         data: &[u8],
         align: u64,
     ) -> u64 {
         let offset = self.append_section_data(section, data, align);
-        let symbol = self.symbol_mut(symbol);
+        self.set_symbol_data(symbol_id, section, offset, data.len() as u64);
+        offset
+    }
+
+    /// Append zero-initialized data to an existing section, and update a symbol to refer to it.
+    ///
+    /// For Mach-O, this also creates a `__thread_vars` entry for TLS symbols, and the
+    /// symbol will indirectly point to the added data via the `__thread_vars` entry.
+    ///
+    /// Returns the section offset of the data.
+    pub fn add_symbol_bss(
+        &mut self,
+        symbol_id: SymbolId,
+        section: SectionId,
+        size: u64,
+        align: u64,
+    ) -> u64 {
+        let offset = self.append_section_bss(section, size, align);
+        self.set_symbol_data(symbol_id, section, offset, size);
+        offset
+    }
+
+    /// Update a symbol to refer to the given data within a section.
+    ///
+    /// For Mach-O, this also creates a `__thread_vars` entry for TLS symbols, and the
+    /// symbol will indirectly point to the data via the `__thread_vars` entry.
+    pub fn set_symbol_data(
+        &mut self,
+        mut symbol_id: SymbolId,
+        section: SectionId,
+        offset: u64,
+        size: u64,
+    ) {
+        // Defined symbols must have a scope.
+        debug_assert!(self.symbol(symbol_id).scope != SymbolScope::Unknown);
+        if self.format == BinaryFormat::Macho {
+            symbol_id = self.macho_add_thread_var(symbol_id);
+        }
+        let symbol = self.symbol_mut(symbol_id);
         symbol.value = offset;
-        symbol.size = data.len() as u64;
+        symbol.size = size;
         symbol.section = Some(section);
-        offset
+    }
+
+    /// Convert a symbol to a section symbol and offset.
+    ///
+    /// Returns an error if the symbol is not defined.
+    pub fn symbol_section_and_offset(
+        &mut self,
+        symbol_id: SymbolId,
+    ) -> Result<(SymbolId, u64), ()> {
+        let symbol = self.symbol(symbol_id);
+        if symbol.kind == SymbolKind::Section {
+            return Ok((symbol_id, 0));
+        }
+        let symbol_offset = symbol.value;
+        let section = symbol.section.ok_or(())?;
+        let section_symbol = self.section_symbol(section);
+        Ok((section_symbol, symbol_offset))
     }
 
     /// Add a relocation to a section.
     ///
     /// Relocations must only be added after the referenced symbols have been added
     /// and defined (if applicable).
     pub fn add_relocation(
         &mut self,
@@ -381,40 +456,51 @@ pub enum StandardSegment {
 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub enum StandardSection {
     Text,
     Data,
     ReadOnlyData,
     ReadOnlyDataWithRel,
     ReadOnlyString,
     UninitializedData,
+    Tls,
+    /// Zero-fill TLS initializers. Unsupported for COFF.
+    UninitializedTls,
+    /// TLS variable structures. Only supported for Mach-O.
+    TlsVariables,
 }
 
 impl StandardSection {
     /// Return the section kind of a standard section.
     pub fn kind(self) -> SectionKind {
         match self {
             StandardSection::Text => SectionKind::Text,
             StandardSection::Data => SectionKind::Data,
             StandardSection::ReadOnlyData | StandardSection::ReadOnlyDataWithRel => {
                 SectionKind::ReadOnlyData
             }
             StandardSection::ReadOnlyString => SectionKind::ReadOnlyString,
             StandardSection::UninitializedData => SectionKind::UninitializedData,
+            StandardSection::Tls => SectionKind::Tls,
+            StandardSection::UninitializedTls => SectionKind::UninitializedTls,
+            StandardSection::TlsVariables => SectionKind::TlsVariables,
         }
     }
 
     fn all() -> &'static [StandardSection] {
         &[
             StandardSection::Text,
             StandardSection::Data,
             StandardSection::ReadOnlyData,
             StandardSection::ReadOnlyDataWithRel,
             StandardSection::ReadOnlyString,
             StandardSection::UninitializedData,
+            StandardSection::Tls,
+            StandardSection::UninitializedTls,
+            StandardSection::TlsVariables,
         ]
     }
 }
 
 /// An identifier used to reference a section.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
 pub struct SectionId(usize);
 
@@ -553,33 +639,36 @@ pub struct Relocation {
 
 /// The symbol name mangling scheme.
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub enum Mangling {
     /// No symbol mangling.
     None,
     /// Windows COFF symbol mangling.
     Coff,
+    /// Windows COFF i386 symbol mangling.
+    CoffI386,
     /// ELF symbol mangling.
     Elf,
     /// Mach-O symbol mangling.
     Macho,
 }
 
 impl Mangling {
     /// Return the default symboling mangling for the given format and architecture.
-    pub fn default(format: BinaryFormat, _architecture: Architecture) -> Self {
-        match format {
-            BinaryFormat::Coff => Mangling::Coff,
-            BinaryFormat::Elf => Mangling::Elf,
-            BinaryFormat::Macho => Mangling::Macho,
+    pub fn default(format: BinaryFormat, architecture: Architecture) -> Self {
+        match (format, architecture) {
+            (BinaryFormat::Coff, Architecture::I386) => Mangling::CoffI386,
+            (BinaryFormat::Coff, _) => Mangling::Coff,
+            (BinaryFormat::Elf, _) => Mangling::Elf,
+            (BinaryFormat::Macho, _) => Mangling::Macho,
             _ => Mangling::None,
         }
     }
 
     /// Return the prefix to use for global symbols.
     pub fn global_prefix(self) -> Option<u8> {
         match self {
-            Mangling::None | Mangling::Elf => None,
-            Mangling::Coff | Mangling::Macho => Some(b'_'),
+            Mangling::None | Mangling::Elf | Mangling::Coff => None,
+            Mangling::CoffI386 | Mangling::Macho => Some(b'_'),
         }
     }
 }
--- a/third_party/rust/object/tests/round_trip.rs
+++ b/third_party/rust/object/tests/round_trip.rs
@@ -53,17 +53,17 @@ fn coff_x86_64() {
     assert_eq!(text.size(), 62);
     assert_eq!(&text.data()[..30], &[1; 30]);
     assert_eq!(&text.data()[32..62], &[1; 30]);
 
     let mut symbols = object.symbols();
 
     let (func1_symbol, symbol) = symbols.next().unwrap();
     println!("{:?}", symbol);
-    assert_eq!(symbol.name(), Some("_func1"));
+    assert_eq!(symbol.name(), Some("func1"));
     assert_eq!(symbol.address(), func1_offset);
     assert_eq!(symbol.kind(), SymbolKind::Text);
     assert_eq!(symbol.section_index(), Some(text_index));
     assert_eq!(symbol.scope(), SymbolScope::Linkage);
     assert_eq!(symbol.is_weak(), false);
     assert_eq!(symbol.is_undefined(), false);
 
     let mut relocations = text.relocations();
new file mode 100644
--- /dev/null
+++ b/third_party/rust/object/tests/tls.rs
@@ -0,0 +1,167 @@
+#![cfg(all(feature = "read", feature = "write"))]
+
+use object::read::{Object, ObjectSection};
+use object::{read, write};
+use object::{RelocationEncoding, RelocationKind, SectionKind, SymbolKind, SymbolScope};
+use target_lexicon::{Architecture, BinaryFormat};
+
+#[test]
+fn macho_x86_64_tls() {
+    let mut object = write::Object::new(BinaryFormat::Macho, Architecture::X86_64);
+
+    let section = object.section_id(write::StandardSection::Tls);
+    let symbol = object.add_symbol(write::Symbol {
+        name: b"tls1".to_vec(),
+        value: 0,
+        size: 0,
+        kind: SymbolKind::Tls,
+        scope: SymbolScope::Linkage,
+        weak: false,
+        section: None,
+    });
+    object.add_symbol_data(symbol, section, &[1; 30], 4);
+
+    let section = object.section_id(write::StandardSection::UninitializedTls);
+    let symbol = object.add_symbol(write::Symbol {
+        name: b"tls2".to_vec(),
+        value: 0,
+        size: 0,
+        kind: SymbolKind::Tls,
+        scope: SymbolScope::Linkage,
+        weak: false,
+        section: None,
+    });
+    object.add_symbol_bss(symbol, section, 31, 4);
+
+    let bytes = object.write().unwrap();
+
+    std::fs::write(&"tls.o", &bytes).unwrap();
+
+    let object = read::File::parse(&bytes).unwrap();
+    assert_eq!(object.format(), BinaryFormat::Macho);
+    assert_eq!(object.architecture(), Architecture::X86_64);
+
+    let mut sections = object.sections();
+
+    let thread_data = sections.next().unwrap();
+    println!("{:?}", section);
+    let thread_data_index = thread_data.index();
+    assert_eq!(thread_data.name(), Some("__thread_data"));
+    assert_eq!(thread_data.segment_name(), Some("__DATA"));
+    assert_eq!(thread_data.kind(), SectionKind::Tls);
+    assert_eq!(thread_data.size(), 30);
+    assert_eq!(&thread_data.data()[..], &[1; 30]);
+
+    let thread_vars = sections.next().unwrap();
+    println!("{:?}", section);
+    let thread_vars_index = thread_vars.index();
+    assert_eq!(thread_vars.name(), Some("__thread_vars"));
+    assert_eq!(thread_vars.segment_name(), Some("__DATA"));
+    assert_eq!(thread_vars.kind(), SectionKind::TlsVariables);
+    assert_eq!(thread_vars.size(), 2 * 3 * 8);
+
+    let thread_bss = sections.next().unwrap();
+    println!("{:?}", section);
+    let thread_bss_index = thread_bss.index();
+    assert_eq!(thread_bss.name(), Some("__thread_bss"));
+    assert_eq!(thread_bss.segment_name(), Some("__DATA"));
+    assert_eq!(thread_bss.kind(), SectionKind::UninitializedTls);
+    assert_eq!(thread_bss.size(), 31);
+
+    let mut symbols = object.symbols();
+
+    let (_, symbol) = symbols.next().unwrap();
+    println!("{:?}", symbol);
+    assert_eq!(symbol.name(), Some("_tls1"));
+    assert_eq!(symbol.kind(), SymbolKind::Tls);
+    assert_eq!(symbol.section_index(), Some(thread_vars_index));
+    assert_eq!(symbol.scope(), SymbolScope::Linkage);
+    assert_eq!(symbol.is_weak(), false);
+    assert_eq!(symbol.is_undefined(), false);
+
+    let (tls1_init_symbol, symbol) = symbols.next().unwrap();
+    println!("{:?}", symbol);
+    assert_eq!(symbol.name(), Some("_tls1$tlv$init"));
+    assert_eq!(symbol.kind(), SymbolKind::Tls);
+    assert_eq!(symbol.section_index(), Some(thread_data_index));
+    assert_eq!(symbol.scope(), SymbolScope::Compilation);
+    assert_eq!(symbol.is_weak(), false);
+    assert_eq!(symbol.is_undefined(), false);
+
+    let (tlv_bootstrap_symbol, symbol) = symbols.next().unwrap();
+    println!("{:?}", symbol);
+    assert_eq!(symbol.name(), Some("__tlv_bootstrap"));
+    assert_eq!(symbol.kind(), SymbolKind::Unknown);
+    assert_eq!(symbol.section_index(), None);
+    assert_eq!(symbol.scope(), SymbolScope::Unknown);
+    assert_eq!(symbol.is_weak(), false);
+    assert_eq!(symbol.is_undefined(), true);
+
+    let (_, symbol) = symbols.next().unwrap();
+    println!("{:?}", symbol);
+    assert_eq!(symbol.name(), Some("_tls2"));
+    assert_eq!(symbol.kind(), SymbolKind::Tls);
+    assert_eq!(symbol.section_index(), Some(thread_vars_index));
+    assert_eq!(symbol.scope(), SymbolScope::Linkage);
+    assert_eq!(symbol.is_weak(), false);
+    assert_eq!(symbol.is_undefined(), false);
+
+    let (tls2_init_symbol, symbol) = symbols.next().unwrap();
+    println!("{:?}", symbol);
+    assert_eq!(symbol.name(), Some("_tls2$tlv$init"));
+    assert_eq!(symbol.kind(), SymbolKind::Tls);
+    assert_eq!(symbol.section_index(), Some(thread_bss_index));
+    assert_eq!(symbol.scope(), SymbolScope::Compilation);
+    assert_eq!(symbol.is_weak(), false);
+    assert_eq!(symbol.is_undefined(), false);
+
+    let mut relocations = thread_vars.relocations();
+
+    let (offset, relocation) = relocations.next().unwrap();
+    println!("{:?}", relocation);
+    assert_eq!(offset, 0);
+    assert_eq!(relocation.kind(), RelocationKind::Absolute);
+    assert_eq!(relocation.encoding(), RelocationEncoding::Generic);
+    assert_eq!(relocation.size(), 64);
+    assert_eq!(
+        relocation.target(),
+        read::RelocationTarget::Symbol(tlv_bootstrap_symbol)
+    );
+    assert_eq!(relocation.addend(), 0);
+
+    let (offset, relocation) = relocations.next().unwrap();
+    println!("{:?}", relocation);
+    assert_eq!(offset, 16);
+    assert_eq!(relocation.kind(), RelocationKind::Absolute);
+    assert_eq!(relocation.encoding(), RelocationEncoding::Generic);
+    assert_eq!(relocation.size(), 64);
+    assert_eq!(
+        relocation.target(),
+        read::RelocationTarget::Symbol(tls1_init_symbol)
+    );
+    assert_eq!(relocation.addend(), 0);
+
+    let (offset, relocation) = relocations.next().unwrap();
+    println!("{:?}", relocation);
+    assert_eq!(offset, 24);
+    assert_eq!(relocation.kind(), RelocationKind::Absolute);
+    assert_eq!(relocation.encoding(), RelocationEncoding::Generic);
+    assert_eq!(relocation.size(), 64);
+    assert_eq!(
+        relocation.target(),
+        read::RelocationTarget::Symbol(tlv_bootstrap_symbol)
+    );
+    assert_eq!(relocation.addend(), 0);
+
+    let (offset, relocation) = relocations.next().unwrap();
+    println!("{:?}", relocation);
+    assert_eq!(offset, 40);
+    assert_eq!(relocation.kind(), RelocationKind::Absolute);
+    assert_eq!(relocation.encoding(), RelocationEncoding::Generic);
+    assert_eq!(relocation.size(), 64);
+    assert_eq!(
+        relocation.target(),
+        read::RelocationTarget::Symbol(tls2_init_symbol)
+    );
+    assert_eq!(relocation.addend(), 0);
+}
--- a/third_party/rust/parity-wasm/.cargo-checksum.json
+++ b/third_party/rust/parity-wasm/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.lock":"dd455c291a91baffc495609fa138136dea7f7a5b1da42171c8e17f703fb19492","Cargo.toml":"59e7f11e94049b00d4a1a83e72c563bfc6b5148cc8e1577d076a151eaec0b538","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"8399429a620f47708d2e3ba5d2879acbe4824bf4253402abf02811e3c34a1827","README.md":"4b6dfacc8a84f2a5fdbc9e4a3fcb9759e83867fa639dd2765b5d032b783bc102","examples/bench-decoder.rs":"f5df121e9170eab8cf79e11f2d79cc3847b180c0c75b467a0d6765484b6e5c14","examples/build.rs":"f5c20372064cf0fde5658b37ea52b6bbba6021f3efc405c3ba62fca1f55957a6","examples/data.rs":"6c09975fa03535882e1b7ef961001a658c56e2ff1ca069336234c307c13b200e","examples/exports.rs":"44a457058983ddc7f09744fbb0fef64a105530bf331ff05a671d589fecc61ce8","examples/info.rs":"3c1abccc4d1b7975d8b116a76ffdc35cfcdff0a94ddaedac06a91bdb675717c2","examples/inject.rs":"012192c1c929c24a115d7de20d283a4b2d3ea4b1d80890bc0b0929f4d8d85b20","examples/roundtrip.rs":"b8020646329055f279948e3171051b5942eaa006a01e55838fcc8e8490b216e7","examples/show.rs":"4a0452c71a173ea3c187e2b4e8af7286259733d9c4e2cb439989439099c33ad4","src/builder/code.rs":"70331ed5457a747c245a26ffde02488644833a1a01258e11aa8e1d4e88b40120","src/builder/data.rs":"2b2e601f5ec05b25452659c19e58b4289303e054ede9dcfa65f31c4a9f449d53","src/builder/export.rs":"2f3382a24b700713824271edc0ffe3205a7b8d301d816cbc82ffe7102113e326","src/builder/global.rs":"9eba209084beb600714148f96661961948bf9f27a229b7f2e5b88ee59b3d8fcf","src/builder/import.rs":"dfff9c7e4ef5e549d34880052d3ec45d39208a60b6dab32f254e55b4b4eb8937","src/builder/invoke.rs":"64d9eeb6e44538619316c43270f1342a42fc1649b4ed65e698bfd60075036109","src/builder/memory.rs":"c8f9410c56bb11044dbc3b9a55641b9ed8086022da5ad4a54c9669aa2cff9bbd","src/builder/misc.rs":"add9ab8c6dd8f167ba046fd5faf595ae83b6597ca34b4b393f92d9737848fc1d","src/builder/mod.rs":"c8de0fd2167170e2148f617eb941814becd45369351a635cdca88f45ab19adc1","src/builder/module.rs":"8a024ad08994ba091f405b29f9537e68f13abd3126484c08bd5116de699cbef3","src/builder/table.rs":"5eee0313c83be28691fda016a0603afc38bb4cb1305d2dd7c5b8d8dd4c1ddbfb","src/elements/export_entry.rs":"1d8e956fd50c63ae6996902bcef534a9564bddd69a46bf4255a6bae32b02f9dc","src/elements/func.rs":"f35af742b60dc9c044081cdcc9844f40578215ad92ad58d78e004561eba0d566","src/elements/global_entry.rs":"ad9290d8d548eed4fbc24d886fc571f274cbf797296369ad7091d1b9825e6001","src/elements/import_entry.rs":"3f7d829cfbbd245097243cbe5395c34b41c08dfb32a0eb5a4584f1d8fe1a7a32","src/elements/index_map.rs":"926442bb14cf0c46b4bcbef223639c11e2239f6c76760898a3d796f28f3dee28","src/elements/mod.rs":"ba7fe560fd066c74a32f87f151997cd58dc9b6790b30727020445e193ceb1695","src/elements/module.rs":"941cbdc702cbc7ac23f466385824bfda6147d2dd330302a46f5bbc9c5edea440","src/elements/name_section.rs":"017fa7ea1a4a4b90f7a83cff9dd676651ada82eb24b527cbacea430738ca8abf","src/elements/ops.rs":"3965ae04cc81d97ddb43ac25dc4f0fadac16752e9053d034d980b235c13c34bc","src/elements/primitives.rs":"be894c6e5246dcb8c47058ca470c507c1c278fa7172f24cf03669351af003215","src/elements/reloc_section.rs":"a4393d3873d0fa47ed448af1f99053244d38a0424c72ca8828e4516b712e41d7","src/elements/section.rs":"60d8c0330a252f2439cb089b559de7ec2167d7adf484865ba39a9b4d5321a11b","src/elements/segment.rs":"f882889664fff6a138f1910203b5fea27c6f5130ba183da48386426bf86d003c","src/elements/types.rs":"6fb15ab727e7cd3262c523cc47cc4eaf2f56b5079bbe9fa2e080ddf8b277ffbb","src/io.rs":"b274b3396010939128da9fc0516954a72fb7ed1fb9e8d57f3b06daee12e677af","src/lib.rs":"3eaa32f1fc81fac1e897ed50937fb191998c81cef9241566cca98658abf0b602"},"package":"1e39faaa292a687ea15120b1ac31899b13586446521df6c149e46f1584671e0f"}
\ No newline at end of file
+{"files":{"Cargo.lock":"53519a2873c0ad143e974fe1acd774828bf0159ced3641dad0effde529694fa9","Cargo.toml":"924b59e3b9aa83a9ad1093f76e0f77e90152852bb340e73fa9598f3c0637d74f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"8399429a620f47708d2e3ba5d2879acbe4824bf4253402abf02811e3c34a1827","README.md":"4cc86ad2a9d094139667abef054090f17ed745f8f0dd197c897b170939f04d32","examples/bench-decoder.rs":"f5df121e9170eab8cf79e11f2d79cc3847b180c0c75b467a0d6765484b6e5c14","examples/build.rs":"f5c20372064cf0fde5658b37ea52b6bbba6021f3efc405c3ba62fca1f55957a6","examples/data.rs":"6c09975fa03535882e1b7ef961001a658c56e2ff1ca069336234c307c13b200e","examples/exports.rs":"44a457058983ddc7f09744fbb0fef64a105530bf331ff05a671d589fecc61ce8","examples/info.rs":"3c1abccc4d1b7975d8b116a76ffdc35cfcdff0a94ddaedac06a91bdb675717c2","examples/inject.rs":"012192c1c929c24a115d7de20d283a4b2d3ea4b1d80890bc0b0929f4d8d85b20","examples/roundtrip.rs":"b8020646329055f279948e3171051b5942eaa006a01e55838fcc8e8490b216e7","examples/show.rs":"4a0452c71a173ea3c187e2b4e8af7286259733d9c4e2cb439989439099c33ad4","src/builder/code.rs":"1b6f446af85502de8f15cf20ef40ccd31f7b4e0e3a91e72b58f882645f2beada","src/builder/data.rs":"6019920bbe7709f75a07a59cd8dedb8c0d94520ccad173851303d56726d41d51","src/builder/export.rs":"4b8f86d3f897c588bb93c14141e9e622c4cdc44f20a00c47aa3f0cae2588a63c","src/builder/global.rs":"9eba209084beb600714148f96661961948bf9f27a229b7f2e5b88ee59b3d8fcf","src/builder/import.rs":"efb49617cf500743bc3a63ca9bdaa7bc54e6dd652fbbdc8d74f0971dee0997d6","src/builder/invoke.rs":"64d9eeb6e44538619316c43270f1342a42fc1649b4ed65e698bfd60075036109","src/builder/memory.rs":"c5c3d8a9b96b85e1624933c445186584b78c195452135c62afd4844b8c963e67","src/builder/misc.rs":"b1c8e486c5f4a7b84d0094266e20a6ee0e7cbf0f4a4e27c8d5542da69ddf86d2","src/builder/mod.rs":"c8de0fd2167170e2148f617eb941814becd45369351a635cdca88f45ab19adc1","src/builder/module.rs":"4557ab4e40c4ca21f232c482e8d0dd9c0dbc32e32ef8cda2d6c4c8dfffcfe449","src/builder/table.rs":"465aa62f49a67901fc7bada7fca6a704727c12b81f6b4ee481100f50c36cbf62","src/elements/export_entry.rs":"64155fdead9e9788ab4289f8061d87249a35da2d8f1c82c0fd015aad9c56590a","src/elements/func.rs":"ec6268a25e55a2e25bbf9aa4d4c903d3984d01e7c041a994fba189bad52505b9","src/elements/global_entry.rs":"ad9290d8d548eed4fbc24d886fc571f274cbf797296369ad7091d1b9825e6001","src/elements/import_entry.rs":"ab5134914836c20b0591da3b6553fbf4a407e5b61076b80796176f6981227239","src/elements/index_map.rs":"fcfebc34674320b9c24c2d38059ba2bd40b20f1f869db9bcd0c3019954e8d80d","src/elements/mod.rs":"5980cab12dc79de81de0f554a8c03d334310c81975f6f1f65fdbde1be9f4b484","src/elements/module.rs":"5e72540db4f308ab6e01539b13bb92ae267bd64c3ed3d8c3c1ee6f4a6bb7b7c6","src/elements/name_section.rs":"f523fe602d4b4c38c1d6d78b10267d78dca63da70d783178b5b5f0d345e75e9a","src/elements/ops.rs":"0de95483bfa159ebf776f941f59661278f7a4cf020843b8b1bdfa2875d6cee1a","src/elements/primitives.rs":"2df2c6de944ec8afb52c8da468858760672e3e2e8f96e1c0719d609a18f19bdd","src/elements/reloc_section.rs":"64a6289263139076784ce0c0d67095792146c2e4928fb816ad8fa55f2bb94ad0","src/elements/section.rs":"e60385bb50cf77e6aab3ba9b65cfb30f31e97279a8e9d19cf0893b02370adf25","src/elements/segment.rs":"cfb90b6b79e04f11e33b9d6536208a45fb6d8ef5e23d215f06e4f5d3dfa953e8","src/elements/types.rs":"528ca235eb77fdcf2174403f6d7388d73e63ca019f633a08e719c2b5a6b5fe31","src/io.rs":"33b4eb10e63564114683fa87e4b918102e750d93a2a8957a954b97400d497ccb","src/lib.rs":"d8fc9409acddfc062dfce385eca48b7c5dff847ed0f2795bf2ac973eeb04ee4a"},"package":"ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865"}
\ No newline at end of file
--- a/third_party/rust/parity-wasm/Cargo.lock
+++ b/third_party/rust/parity-wasm/Cargo.lock
@@ -2,17 +2,17 @@
 # It is not intended for manual editing.
 [[package]]
 name = "libc"
 version = "0.2.51"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "parity-wasm"
-version = "0.40.3"
+version = "0.41.0"
 dependencies = [
  "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "redox_syscall"
 version = "0.1.51"
 source = "registry+https://github.com/rust-lang/crates.io-index"
--- a/third_party/rust/parity-wasm/Cargo.toml
+++ b/third_party/rust/parity-wasm/Cargo.toml
@@ -8,17 +8,17 @@
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 edition = "2018"
 name = "parity-wasm"
-version = "0.40.3"
+version = "0.41.0"
 authors = ["Nikolay Volf <nikvolf@gmail.com>", "Svyatoslav Nikolsky <svyatonik@yandex.ru>", "Sergey Shulepov <s.pepyakin@gmail.com>"]
 exclude = ["res/*", "spec/*"]
 description = "WebAssembly low-level format library"
 homepage = "https://github.com/paritytech/parity-wasm"
 documentation = "https://paritytech.github.io/parity-wasm/parity_wasm/"
 readme = "README.md"
 keywords = ["wasm", "webassembly", "bytecode", "serde", "interpreter"]
 categories = ["wasm", "parser-implementations"]
--- a/third_party/rust/parity-wasm/README.md
+++ b/third_party/rust/parity-wasm/README.md
@@ -1,32 +1,29 @@
 # parity-wasm
 
 Low-level WebAssembly format library.
 
 [![Build Status](https://travis-ci.org/paritytech/parity-wasm.svg?branch=master)](https://travis-ci.org/paritytech/parity-wasm)
 [![crates.io link](https://img.shields.io/crates/v/parity-wasm.svg)](https://crates.io/crates/parity-wasm)
 
-[Documentation](https://paritytech.github.io/parity-wasm/parity_wasm/)
+[Documentation](https://docs.rs/parity-wasm/0.40.2/parity_wasm/)
 
 ## Rust WebAssembly format serializing/deserializing
 
 Add to Cargo.toml
 
 ```toml
 [dependencies]
-parity-wasm = "0.40"
+parity-wasm = "0.41"
 ```
 
 and then
 
 ```rust
-
-extern crate parity_wasm;
-
 let module = parity_wasm::deserialize_file("./res/cases/v1/hello.wasm").unwrap();
 assert!(module.code_section().is_some());
 
 let code_section = module.code_section().unwrap(); // Part of the module with functions code
 
 println!("Function count in wasm file: {}", code_section.bodies().len());
 ```
 
@@ -49,21 +46,19 @@ Decoder can be fuzzed with `cargo-fuzz` 
 
 ## `no_std` crates
 
 This crate has a feature, `std`, that is enabled by default. To use this crate
 in a `no_std` context, add the following to your `Cargo.toml` (still requires allocator though):
 
 ```toml
 [dependencies]
-parity-wasm = { version = "0.40", default-features = false }
+parity-wasm = { version = "0.41", default-features = false }
 ```
 
-Until allocator api is stabilized, this type of use is limited to nightly Rust.
-
 # License
 
 `parity-wasm` is primarily distributed under the terms of both the MIT
 license and the Apache License (Version 2.0), at your choice.
 
 See LICENSE-APACHE, and LICENSE-MIT for details.
 
 ### Contribution
--- a/third_party/rust/parity-wasm/src/builder/code.rs
+++ b/third_party/rust/parity-wasm/src/builder/code.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use crate::elements;
 use super::{
 	invoke::{Invoke, Identity},
 	misc::{ValueTypeBuilder, ValueTypesBuilder, OptionalValueTypeBuilder},
 };
 
 /// Signature template description
 pub enum Signature {
--- a/third_party/rust/parity-wasm/src/builder/data.rs
+++ b/third_party/rust/parity-wasm/src/builder/data.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use super::invoke::{Identity, Invoke};
 use crate::elements;
 
 /// Data segment builder
 pub struct DataSegmentBuilder<F=Identity> {
 	callback: F,
 	// todo: add mapper once multiple memory refs possible
 	mem_index: u32,
--- a/third_party/rust/parity-wasm/src/builder/export.rs
+++ b/third_party/rust/parity-wasm/src/builder/export.rs
@@ -1,9 +1,9 @@
-use crate::rust::{string::String, borrow::ToOwned};
+use alloc::{borrow::ToOwned, string::String};
 use super::invoke::{Invoke, Identity};
 use crate::elements;
 
 /// Export entry builder
 pub struct ExportBuilder<F=Identity> {
 	callback: F,
 	field: String,
 	binding: elements::Internal,
--- a/third_party/rust/parity-wasm/src/builder/import.rs
+++ b/third_party/rust/parity-wasm/src/builder/import.rs
@@ -1,9 +1,9 @@
-use crate::rust::{borrow::ToOwned, string::String};
+use alloc::{borrow::ToOwned, string::String};
 use super::invoke::{Identity, Invoke};
 use crate::elements;
 
 /// Import builder
 pub struct ImportBuilder<F=Identity> {
 	callback: F,
 	module: String,
 	field: String,
--- a/third_party/rust/parity-wasm/src/builder/memory.rs
+++ b/third_party/rust/parity-wasm/src/builder/memory.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use crate::elements;
 use super::invoke::{Invoke, Identity};
 
 /// Memory definition struct
 #[derive(Debug, PartialEq)]
 pub struct MemoryDefinition {
 	/// Minimum memory size
 	pub min: u32,
--- a/third_party/rust/parity-wasm/src/builder/misc.rs
+++ b/third_party/rust/parity-wasm/src/builder/misc.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use super::invoke::{Invoke, Identity};
 use crate::elements;
 
 pub struct ValueTypeBuilder<F=Identity> {
 	callback: F,
 }
 
 impl<F> ValueTypeBuilder<F> where F: Invoke<elements::ValueType> {
--- a/third_party/rust/parity-wasm/src/builder/module.rs
+++ b/third_party/rust/parity-wasm/src/builder/module.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use crate::elements;
 use super::{
 	import,
 	export,
 	global,
 	data,
 	invoke::{Invoke, Identity},
 	code::{self, SignaturesBuilder, FunctionBuilder},
--- a/third_party/rust/parity-wasm/src/builder/table.rs
+++ b/third_party/rust/parity-wasm/src/builder/table.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use crate::elements;
 use super::invoke::{Invoke, Identity};
 
 /// Table definition
 #[derive(Debug, PartialEq)]
 pub struct TableDefinition {
 	/// Minimum length
 	pub min: u32,
--- a/third_party/rust/parity-wasm/src/elements/export_entry.rs
+++ b/third_party/rust/parity-wasm/src/elements/export_entry.rs
@@ -1,9 +1,9 @@
-use crate::rust::string::String;
+use alloc::string::String;
 use super::{Deserialize, Serialize, Error, VarUint7, VarUint32};
 use crate::io;
 
 /// Internal reference of the exported entry.
 #[derive(Debug, Clone, Copy, PartialEq)]
 pub enum Internal {
 	/// Function reference.
 	Function(u32),
--- a/third_party/rust/parity-wasm/src/elements/func.rs
+++ b/third_party/rust/parity-wasm/src/elements/func.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use super::{
 	Deserialize, Error, ValueType, VarUint32, CountedList, Instructions,
 	Serialize, CountedWriter, CountedListWriter,
 };
 use crate::{io, elements::section::SectionReader};
 
 /// Function signature (type reference)
 #[derive(Debug, Copy, Clone, PartialEq)]
--- a/third_party/rust/parity-wasm/src/elements/import_entry.rs
+++ b/third_party/rust/parity-wasm/src/elements/import_entry.rs
@@ -1,9 +1,9 @@
-use crate::rust::string::String;
+use alloc::string::String;
 use crate::io;
 use super::{
 	Deserialize, Serialize, Error, VarUint7, VarInt7, VarUint32, VarUint1, Uint8,
 	ValueType, TableElementType
 };
 
 const FLAG_HAS_MAX: u8 = 0x01;
 #[cfg(feature="atomics")]
--- a/third_party/rust/parity-wasm/src/elements/index_map.rs
+++ b/third_party/rust/parity-wasm/src/elements/index_map.rs
@@ -1,20 +1,20 @@
-use crate::rust::{
-	cmp::min,
-	iter::{FromIterator, IntoIterator},
-	mem,
-	slice,
-	vec::{self, Vec},
-};
-
+use alloc::vec::Vec;
 use crate::io;
 
 use super::{Deserialize, Error, Serialize, VarUint32};
 
+use alloc::vec;
+use core::{
+	cmp::min,
+	iter::{FromIterator, IntoIterator},
+	mem, slice
+};
+
 /// A map from non-contiguous `u32` keys to values of type `T`, which is
 /// serialized and deserialized ascending order of the keys. Normally used for
 /// relative dense maps with occasional "holes", and stored as an array.
 ///
 /// **SECURITY WARNING:** This code is currently subject to a denial of service
 /// attack if you create a map containing the key `u32::MAX`, which should never
 /// happen in normal data. It would be pretty easy to provide a safe
 /// deserializing mechanism which addressed this problem.
--- a/third_party/rust/parity-wasm/src/elements/mod.rs
+++ b/third_party/rust/parity-wasm/src/elements/mod.rs
@@ -1,13 +1,15 @@
 //! Elements of the WebAssembly binary format.
 
-use crate::rust::{fmt, vec::Vec, format, string::String};
+use alloc::{string::String, vec::Vec};
 use crate::io;
 
+use core::fmt;
+
 macro_rules! buffered_read {
 	($buffer_size: expr, $length: expr, $reader: expr) => {
 		{
 			let mut vec_buf = Vec::new();
 			let mut total_read = 0;
 			let mut buf = [0u8; $buffer_size];
 			while total_read < $length {
 				let next_to_read = if $length - total_read > $buffer_size { $buffer_size } else { $length - total_read };
--- a/third_party/rust/parity-wasm/src/elements/module.rs
+++ b/third_party/rust/parity-wasm/src/elements/module.rs
@@ -1,20 +1,22 @@
-use crate::rust::{vec::Vec, borrow::ToOwned, string::String, cmp};
+use alloc::{borrow::ToOwned, vec::Vec, string::String};
 use crate::io;
 
 use super::{deserialize_buffer, serialize, Deserialize, Serialize, Error, Uint32, External};
 use super::section::{
 	Section, CodeSection, TypeSection, ImportSection, ExportSection, FunctionSection,
 	GlobalSection, TableSection, ElementSection, DataSection, MemorySection,
 	CustomSection,
 };
 use super::name_section::NameSection;
 use super::reloc_section::RelocSection;
 
+use core::cmp;
+
 const WASM_MAGIC_NUMBER: [u8; 4] = [0x00, 0x61, 0x73, 0x6d];
 
 /// WebAssembly module
 #[derive(Debug, Clone, PartialEq)]
 pub struct Module {
 	magic: u32,
 	version: u32,
 	sections: Vec<Section>,
--- a/third_party/rust/parity-wasm/src/elements/name_section.rs
+++ b/third_party/rust/parity-wasm/src/elements/name_section.rs
@@ -1,9 +1,9 @@
-use crate::rust::{vec::Vec, string::String};
+use alloc::{string::String, vec::Vec};
 use crate::io;
 
 use super::{Deserialize, Error, Module, Serialize, VarUint32, VarUint7, Type};
 use super::index_map::IndexMap;
 
 const NAME_TYPE_MODULE: u8 = 0;
 const NAME_TYPE_FUNCTION: u8 = 1;
 const NAME_TYPE_LOCAL: u8 = 2;
--- a/third_party/rust/parity-wasm/src/elements/ops.rs
+++ b/third_party/rust/parity-wasm/src/elements/ops.rs
@@ -1,16 +1,17 @@
-use crate::rust::{fmt, vec::Vec, boxed::Box};
+use alloc::{boxed::Box, vec::Vec};
 use crate::io;
 use super::{
 	Serialize, Deserialize, Error,
 	Uint8, VarUint32, CountedList, BlockType,
 	Uint32, Uint64, CountedListWriter,
 	VarInt32, VarInt64,
 };
+use core::fmt;
 
 /// List of instructions (usually inside a block section).
 #[derive(Debug, Clone, PartialEq)]
 pub struct Instructions(Vec<Instruction>);
 
 impl Instructions {
 	/// New list of instructions from vector of instructions.
 	pub fn new(elements: Vec<Instruction>) -> Self {
--- a/third_party/rust/parity-wasm/src/elements/primitives.rs
+++ b/third_party/rust/parity-wasm/src/elements/primitives.rs
@@ -1,9 +1,9 @@
-use crate::rust::{vec::Vec, string::String};
+use alloc::{string::String, vec::Vec};
 use crate::{io, elements};
 use super::{Error, Deserialize, Serialize};
 
 /// Unsigned variable-length integer, limited to 32 bits,
 /// represented by at most 5 bytes that may contain padding 0x80 bytes.
 #[derive(Debug, Copy, Clone, PartialEq)]
 pub struct VarUint32(u32);
 
--- a/third_party/rust/parity-wasm/src/elements/reloc_section.rs
+++ b/third_party/rust/parity-wasm/src/elements/reloc_section.rs
@@ -1,9 +1,9 @@
-use crate::rust::{vec::Vec, string::String};
+use alloc::{string::String, vec::Vec};
 use crate::io;
 
 use super::{CountedList, CountedListWriter, CountedWriter, Deserialize, Error, Serialize, VarInt32, VarUint32, VarUint7};
 
 const FUNCTION_INDEX_LEB: u8 = 0;
 const TABLE_INDEX_SLEB: u8 = 1;
 const TABLE_INDEX_I32: u8 = 2;
 const MEMORY_ADDR_LEB: u8 = 3;
--- a/third_party/rust/parity-wasm/src/elements/section.rs
+++ b/third_party/rust/parity-wasm/src/elements/section.rs
@@ -1,9 +1,9 @@
-use crate::rust::{vec::Vec, string::String, borrow::ToOwned};
+use alloc::{vec::Vec, borrow::ToOwned, string::String};
 use crate::{io, elements};
 use super::{
 	Serialize,
 	Deserialize,
 	Error,
 	VarUint7,
 	VarUint32,
 	CountedList,
--- a/third_party/rust/parity-wasm/src/elements/segment.rs
+++ b/third_party/rust/parity-wasm/src/elements/segment.rs
@@ -1,9 +1,9 @@
-use crate::rust::vec::Vec;
+use alloc::vec::Vec;
 use crate::io;
 use super::{Deserialize, Serialize, Error, VarUint32, CountedList, InitExpr, CountedListWriter};
 
 #[cfg(feature="bulk")]
 const FLAG_MEMZERO: u32 = 0;
 #[cfg(feature="bulk")]
 const FLAG_PASSIVE: u32 = 1;
 #[cfg(feature="bulk")]
--- a/third_party/rust/parity-wasm/src/elements/types.rs
+++ b/third_party/rust/parity-wasm/src/elements/types.rs
@@ -1,14 +1,15 @@
-use crate::rust::{fmt, vec::Vec};
+use alloc::vec::Vec;
 use crate::io;
 use super::{
 	Deserialize, Serialize, Error, VarUint7, VarInt7, VarUint1, CountedList,
 	CountedListWriter, VarUint32,
 };
+use core::fmt;
 
 /// Type definition in types section. Currently can be only of the function type.
 #[derive(Debug, Clone, PartialEq, Hash, Eq)]
 pub enum Type {
 	/// Function type.
 	Function(FunctionType),
 }
 
--- a/third_party/rust/parity-wasm/src/io.rs
+++ b/third_party/rust/parity-wasm/src/io.rs
@@ -1,39 +1,34 @@
 //! Simple abstractions for the IO operations.
 //!
 //! Basically it just a replacement for the std::io that is usable from
 //! the `no_std` environment.
 
-use crate::rust::result;
-
 #[cfg(feature="std")]
-use crate::rust::io;
-
-#[cfg(not(feature="std"))]
-use crate::rust::vec::Vec;
+use std::io;
 
 /// IO specific error.
 #[derive(Debug)]
 pub enum Error {
 	/// Some unexpected data left in the buffer after reading all data.
 	TrailingData,
 
 	/// Unexpected End-Of-File
 	UnexpectedEof,
 
 	/// Invalid data is encountered.
 	InvalidData,
 
 	#[cfg(feature = "std")]
-	IoError(io::Error),
+	IoError(std::io::Error),
 }
 
 /// IO specific Result.
-pub type Result<T> = result::Result<T, Error>;
+pub type Result<T> = core::result::Result<T, Error>;
 
 pub trait Write {
 	/// Write a buffer of data into this write.
 	///
 	/// All data is written at once.
 	fn write(&mut self, buf: &[u8]) -> Result<()>;
 }
 
@@ -73,17 +68,17 @@ impl<T: AsRef<[u8]>> Read for Cursor<T> 
 		}
 		buf.copy_from_slice(&slice[self.pos..(self.pos + requested)]);
 		self.pos += requested;
 		Ok(())
 	}
 }
 
 #[cfg(not(feature = "std"))]
-impl Write for Vec<u8> {
+impl Write for alloc::vec::Vec<u8> {
 	fn write(&mut self, buf: &[u8]) -> Result<()> {
 		self.extend(buf);
 		Ok(())
 	}
 }
 
 #[cfg(feature = "std")]
 impl<T: io::Read> Read for T {
--- a/third_party/rust/parity-wasm/src/lib.rs
+++ b/third_party/rust/parity-wasm/src/lib.rs
@@ -1,15 +1,14 @@
 //! WebAssembly format library
 #![warn(missing_docs)]
 
 #![cfg_attr(not(feature = "std"), no_std)]
-#![cfg_attr(not(feature = "std"), feature(alloc))]
 
-#[cfg(not(feature="std"))] #[macro_use]
+#[macro_use]
 extern crate alloc;
 
 pub mod elements;
 pub mod builder;
 mod io;
 
 pub use elements::{
 	Error as SerializationError,
@@ -18,23 +17,8 @@ pub use elements::{
 	peek_size,
 };
 
 #[cfg(feature = "std")]
 pub use elements::{
 	deserialize_file,
 	serialize_to_file,
 };
-
-#[cfg(not(feature = "std"))]
-pub (crate) mod rust {
-	pub use core::*;
-	pub use ::alloc::format;
-	pub use ::alloc::vec;
-	pub use ::alloc::string;
-	pub use ::alloc::boxed;
-	pub use ::alloc::borrow;
-}
-
-#[cfg(feature="std")]
-pub (crate) mod rust {
-	pub use std::*;
-}
\ No newline at end of file
--- a/third_party/rust/scroll/.cargo-checksum.json
+++ b/third_party/rust/scroll/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"CHANGELOG.md":"10185d875d75e2292ca6a85466f7172785bb26c0a96d9df1a015e8ca8bff30ee","Cargo.toml":"0929aae92ea868067cb43c1460b0a0358d2a9db85faf0e1a0a134e3d24407856","LICENSE":"6e24b7455f0b9afefdf4f3efd59a56ce76a3020c2dc4371937e281fc5e587fd7","README.md":"3bb2aa978e7a60e3d69c974998525d5b580660c90cc564cf432d1aa56849f3c9","benches/bench.rs":"8708dc2a1496298fac48fbbfdb34e05509486a28cbcf4f4370b45cc258b5367b","build.rs":"3d2434ba396b597e666da98765714bd5f1d04230ffc5ef806fa2dec94e0ff7e0","examples/data_ctx.rs":"f252e7ba5390f40fa99282c84112408d757124b8dc6557f06c3a90f6800be859","src/ctx.rs":"d287dc0ec441748761cb4d2aded119067bdd2ac219a03dd78f23492dcca3e178","src/endian.rs":"3e6666d89974342224f346d707f224372ad33c435f2b0eaad4b32ae230e06216","src/error.rs":"370112448083d38c09f317b9a2af998774c92cdde285a6f11d90a24b9a618873","src/greater.rs":"6b8296458041f9fb06eda4be5587036aa9083cc66d8a2bedc712c92b3cb6abba","src/leb128.rs":"d8aa9497bae2a6090bd6255f53e29b8bb335c14352c531415049f6be478601a1","src/lesser.rs":"9c6d187cda4e9f90ffa6df5ccfd14caf72a6601d59883f5eacb38dcbef7f1c60","src/lib.rs":"1fc5200a4b3a6fa8856971052e4e8f10bdc4a90cd8462123fcc742f66f95c726","src/pread.rs":"1de28a2bb1114b1d0da0227dc95e9d74ced081fde86a631a7e25918a73503aca","src/pwrite.rs":"7fb6a7f1ead05596809165ed98034597a8824a5627458cff9ee9f9653ebfad74","tests/api.rs":"478b03a51b22a9ab1711a422cc749dacbc115b347bb78280432ea66d28423f24","tests/readme.rs":"deaa156ae8230ec7beeb2e4c0d4e0f05a97da98397eb4e4e6e994b65924fd845"},"package":"2f84d114ef17fd144153d608fba7c446b0145d038985e7a8cc5d08bb0ce20383"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"de2bbf4669561405d402322f4cc2604218d4986b73b75b41708b9505aebcb02c","Cargo.lock":"7626003b0c93df97f6ab7a9d670d36515ad81276d3c59bd4c085eb089b209bb2","Cargo.toml":"50c099c055c73804a794f0b511a64dba10384eeb2c3e9da9fcd6162a1de97849","LICENSE":"6e24b7455f0b9afefdf4f3efd59a56ce76a3020c2dc4371937e281fc5e587fd7","README.md":"390a6e2459d78fb1db45c6f8ff7f74a391327938305fc09e7756fdc6bd4d5d5b","benches/bench.rs":"9ccbec001bf80b5c4ade12b041193d30406a1bd602fb895f31018001ede87c83","examples/data_ctx.rs":"0f33e092623fd4ef08f63c7f0d75af4fe0274dc7789b9840f2c138098fb08ede","src/ctx.rs":"8a7f5c0144bf3b5db3caaf8fbc4f682ec7b453b04de8d3146f43e155f6a25b85","src/endian.rs":"b552f4de3b5daf507810098eeb07821132821d9f8c6449ffee4f73366afa6387","src/error.rs":"6c5a913a60d5f8e5042622e5c41835a08d18ff3745f6f651c9e74d45cf10ee5b","src/greater.rs":"57afbcb5a2a15ace8434ed660fbede2e2a59ef800d1e866afccb088b5b0dbd37","src/leb128.rs":"405f6f2629c77524fd61a1fb11724ba234445cabdc38bd2c60b06300565fdd5b","src/lesser.rs":"13c17bea288a0ff31d9bd4e34aec4be4d51dfb33c510f2c3ff834975089d60a4","src/lib.rs":"9bf90c9c23cae1b14284c08382d603fedd3ef37264d551601096cc2437ae8335","src/pread.rs":"a35dbde17c382cebb6c6ef18578f766b0041c71b7cadec8392f7a6f208dfb0fa","src/pwrite.rs":"7cc67a72081305c2beadbf7f89935950e22a6eee1d4ed9f12223af65a703bc10","tests/api.rs":"938771c7f1605ff038b993687c0717fcfce4f22912aa2fcf8767f140dcf4bada","tests/readme.rs":"2ceb1fade1cad83f76dcc0568747c07995fcfe85cbe98c40f2b9e3ce45dafe61"},"package":"abb2332cb595d33f7edd5700f4cbf94892e680c7f0ae56adab58a35190b66cb1"}
\ No newline at end of file
--- a/third_party/rust/scroll/CHANGELOG.md
+++ b/third_party/rust/scroll/CHANGELOG.md
@@ -1,10 +1,17 @@
 # Changelog
 All notable changes to this project will be documented in this file.
 
 Before 1.0, this project does not adhere to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
+## [0.10.0] - unreleased
+### Added
+ - scroll is now 2018 compliant, thanks @lzutao: https://github.com/m4b/scroll/pull/49
+ - scroll_derive now lives in scroll repo itself
+### Removed
+ - BREAKING: removed units/size generics in SizeWith, thanks @willglynn: https://github.com/m4b/scroll/pull/45
+
 ## [0.9.1] - 2018-9-22
 ### Added
  - pread primitive references: https://github.com/m4b/scroll/pull/35
  - u128/i128 support: https://github.com/m4b/scroll/pull/32
  - CStr support: https://github.com/m4b/scroll/pull/30
new file mode 100644
--- /dev/null
+++ b/third_party/rust/scroll/Cargo.lock
@@ -0,0 +1,228 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "arrayvec"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memoffset 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "either"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "libc"
+version = "0.2.65"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "memoffset"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "nodrop"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "num_cpus"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rayon"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "scroll"
+version = "0.10.1"
+dependencies = [
+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "syn"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9"
+"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71"
+"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9"
+"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
+"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
+"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
+"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
+"checksum memoffset 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a85c1a8c329f11437034d7313dca647c79096523533a1c79e86f1d0f657c7cc"
+"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+"checksum num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "155394f924cdddf08149da25bfb932d226b4a593ca7468b08191ff6335941af5"
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123"
+"checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b"
+"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
+"checksum scroll_derive 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28"
+"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+"checksum syn 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0e7bedb3320d0f3035594b0b723c8a28d7d336a3eda3881db79e61d676fb644c"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
--- a/third_party/rust/scroll/Cargo.toml
+++ b/third_party/rust/scroll/Cargo.toml
@@ -1,37 +1,36 @@
 # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
 #
 # When uploading crates to the registry Cargo will automatically
 # "normalize" Cargo.toml files for maximal compatibility
 # with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
+# to registry (e.g., crates.io) dependencies
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
+edition = "2018"
 name = "scroll"
-version = "0.9.2"
+version = "0.10.1"
 authors = ["m4b <m4b.github.io@gmail.com>", "Ted Mielczarek <ted@mielczarek.org>"]
 description = "A suite of powerful, extensible, generic, endian-aware Read/Write traits for byte buffers"
 documentation = "https://docs.rs/scroll"
 readme = "README.md"
 keywords = ["bytes", "endian", "immutable", "pread", "pwrite"]
 license = "MIT"
 repository = "https://github.com/m4b/scroll"
 [dependencies.scroll_derive]
-version = "0.9"
+version = "0.10"
 optional = true
 [dev-dependencies.byteorder]
-version = "1.0.0"
+version = "1"
 
 [dev-dependencies.rayon]
-version = "1.0.0"
-[build-dependencies.rustc_version]
-version = "0.2"
+version = "1"
 
 [features]
 default = ["std"]
 derive = ["scroll_derive"]
 std = []
--- a/third_party/rust/scroll/README.md
+++ b/third_party/rust/scroll/README.md
@@ -16,32 +16,30 @@
 ### Documentation
 
 https://docs.rs/scroll
 
 ### Usage
 
 Add to your `Cargo.toml`
 
-```toml
+```toml, no_test
 [dependencies]
-scroll = "0.9"
+scroll = "0.10"
 ```
 
 ### Overview
 
 Scroll implements several traits for read/writing generic containers (byte buffers are currently implemented by default). Most familiar will likely be the `Pread` trait, which at its basic takes an immutable reference to self, an immutable offset to read at, (and a parsing context, more on that later), and then returns the deserialized value.
 
 Because self is immutable, _**all** reads can be performed in parallel_ and hence are trivially parallelizable.
 
 A simple example demonstrates its flexibility:
 
 ```rust
-extern crate scroll;
-
 use scroll::{ctx, Pread, LE};
 
 fn parse() -> Result<(), scroll::Error> {
     let bytes: [u8; 4] = [0xde, 0xad, 0xbe, 0xef];
 
     // reads a u32 out of `b` with the endianness of the host machine, at offset 0, turbofish-style
     let number: u32 = bytes.pread::<u32>(0)?;
     // ...or a byte, with type ascription on the binding.
@@ -76,21 +74,21 @@ fn parse() -> Result<(), scroll::Error> 
 
 fn main() {
   parse().unwrap();
 }
 ```
 
 ### Deriving `Pread` and `Pwrite`
 
-Scroll implements a custom derive that can provide `Pread` and `Pwrite` implementations for your types.
+Scroll implements a custom derive that can provide `Pread` and `Pwrite` implementations for your structs.
 
-``` rust
+```no_test
 #[macro_use]
-extern crate scroll;
+extern crate scroll_derive;
 
 use scroll::{Pread, Pwrite, BE};
 
 #[derive(Pread, Pwrite)]
 struct Data {
     one: u32,
     two: u16,
     three: u8,
@@ -113,28 +111,26 @@ fn parse() -> Result<(), scroll::Error> 
 
 fn main() {
   parse().unwrap();
 }
 ```
 
 This feature is **not** enabled by default, you must enable the `derive` feature in Cargo.toml to use it:
 
-```toml
+```toml, no_test
 [dependencies]
-scroll = { version = "0.9", features = ["derive"] }
+scroll = { version = "0.10", features = ["derive"] }
 ```
 
 # `std::io` API
 
 Scroll can also read/write simple types from a `std::io::Read` or `std::io::Write` implementor. The  built-in numeric types are taken care of for you.  If you want to read a custom type, you need to implement the `FromCtx` (_how_ to parse) and `SizeWith` (_how_ big the parsed thing will be) traits.  You must compile with default features. For example:
 
 ```rust
-extern crate scroll;
-
 use std::io::Cursor;
 use scroll::IOread;
 
 fn parse_io() -> Result<(), scroll::Error> {
     let bytes_ = [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xef,0xbe,0x00,0x00,];
     let mut bytes = Cursor::new(bytes_);
 
     // this will bump the cursor's Seek
@@ -147,18 +143,16 @@ fn parse_io() -> Result<(), scroll::Erro
 fn main() {
   parse_io().unwrap();
 }
 ```
 
 Similarly, we can write to anything that implements `std::io::Write` quite naturally:
 
 ```rust
-extern crate scroll;
-
 use scroll::{IOwrite, LE, BE};
 use std::io::{Write, Cursor};
 
 fn write_io() -> Result<(), scroll::Error> {
     let mut bytes = [0x0u8; 10];
     let mut cursor = Cursor::new(&mut bytes[..]);
     cursor.write_all(b"hello")?;
     cursor.iowrite_with(0xdeadbeef as u32, BE)?;
@@ -177,32 +171,29 @@ Scroll is designed to be highly configur
 
 For example, suppose we have a datatype and we want to specify how to parse or serialize this datatype out of some arbitrary
 byte buffer. In order to do this, we need to provide a [TryFromCtx](trait.TryFromCtx.html) impl for our datatype.
 
 In particular, if we do this for the `[u8]` target, using the convention `(usize, YourCtx)`, you will automatically get access to
 calling `pread_with::<YourDatatype>` on arrays of bytes.
 
 ```rust
-extern crate scroll;
-
 use scroll::{ctx, Pread, BE, Endian};
 
 struct Data<'a> {
   name: &'a str,
   id: u32,
 }
 
 // note the lifetime specified here
 impl<'a> ctx::TryFromCtx<'a, Endian> for Data<'a> {
   type Error = scroll::Error;
-  type Size = usize;
   // and the lifetime annotation on `&'a [u8]` here
   fn try_from_ctx (src: &'a [u8], endian: Endian)
-    -> Result<(Self, Self::Size), Self::Error> {
+    -> Result<(Self, usize), Self::Error> {
     let offset = &mut 0;
     let name = src.gread::<&str>(offset)?;
     let id = src.gread_with(offset, endian)?;
     Ok((Data { name: name, id: id }, *offset))
   }
 }
 
 fn parse_data() -> Result<(), scroll::Error> {
--- a/third_party/rust/scroll/benches/bench.rs
+++ b/third_party/rust/scroll/benches/bench.rs
@@ -1,16 +1,12 @@
 #![feature(test)]
 extern crate test;
-extern crate byteorder;
-extern crate scroll;
-extern crate rayon;
-//extern crate byteio;
 
-use scroll::{Cread, Cwrite, Pread, Pwrite, IOread, IOwrite, LE};
+use scroll::{Cread, Pread, LE};
 use test::black_box;
 
 #[bench]
 fn bench_parallel_cread_with(b: &mut test::Bencher) {
     use rayon::prelude::*;
     let vec = vec![0u8; 1_000_000];
     let nums = vec![0usize; 500_000];
     b.iter(|| {
deleted file mode 100644
--- a/third_party/rust/scroll/build.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-extern crate rustc_version;
-use rustc_version::{version, Version};
-
-fn main() {
-    if version().unwrap() >= Version::parse("1.26.0").unwrap() {
-        println!("cargo:rustc-cfg=rust_1_26");
-    }
-}
--- a/third_party/rust/scroll/examples/data_ctx.rs
+++ b/third_party/rust/scroll/examples/data_ctx.rs
@@ -1,23 +1,20 @@
-extern crate scroll;
-
 use scroll::{ctx, Endian, Pread, BE};
 
 #[derive(Debug)]
 struct Data<'a> {
     name: &'a str,
     id: u32,
 }
 
 impl<'a> ctx::TryFromCtx<'a, Endian> for Data<'a> {
     type Error = scroll::Error;
-    type Size = usize;
     fn try_from_ctx (src: &'a [u8], endian: Endian)
-                     -> Result<(Self, Self::Size), Self::Error> {
+                     -> Result<(Self, usize), Self::Error> {
         let name = src.pread::<&'a str>(0)?;
         let id = src.pread_with(name.len()+1, endian)?;
         Ok((Data { name: name, id: id }, name.len()+4))
     }
 }
 
 fn main() {
     let bytes = b"UserName\x00\x01\x02\x03\x04";
--- a/third_party/rust/scroll/src/ctx.rs
+++ b/third_party/rust/scroll/src/ctx.rs
@@ -23,19 +23,18 @@
 //!
 //! struct Data<'a> {
 //!   name: &'a str,
 //!   id: u32,
 //! }
 //!
 //! impl<'a> ctx::TryFromCtx<'a, Endian> for Data<'a> {
 //!   type Error = scroll::Error;
-//!   type Size = usize;
 //!   fn try_from_ctx (src: &'a [u8], ctx: Endian)
-//!     -> Result<(Self, Self::Size), Self::Error> {
+//!     -> Result<(Self, usize), Self::Error> {
 //!     let name = src.pread::<&str>(0)?;
 //!     let id = src.pread_with(name.len() + 1, ctx)?;
 //!     Ok((Data { name: name, id: id }, name.len() + 1 + 4))
 //!   }
 //! }
 //!
 //! let bytes = b"UserName\x00\x01\x02\x03\x04";
 //! let data = bytes.pread_with::<Data>(0, BE).unwrap();
@@ -48,39 +47,35 @@ use core::ptr::copy_nonoverlapping;
 use core::mem::transmute;
 use core::mem::size_of;
 use core::str;
 use core::result;
 
 #[cfg(feature = "std")]
 use std::ffi::{CStr, CString};
 
-use error;
-use endian::Endian;
+use crate::error;
+use crate::endian::Endian;
 
 /// A trait for measuring how large something is; for a byte sequence, it will be its length.
 pub trait MeasureWith<Ctx> {
-    type Units;
-    #[inline]
     /// How large is `Self`, given the `ctx`?
-    fn measure_with(&self, ctx: &Ctx) -> Self::Units;
+    fn measure_with(&self, ctx: &Ctx) -> usize;
 }
 
 impl<Ctx> MeasureWith<Ctx> for [u8] {
-    type Units = usize;
     #[inline]
-    fn measure_with(&self, _ctx: &Ctx) -> Self::Units {
+    fn measure_with(&self, _ctx: &Ctx) -> usize {
         self.len()
     }
 }
 
 impl<Ctx, T: AsRef<[u8]>> MeasureWith<Ctx> for T {
-    type Units = usize;
     #[inline]
-    fn measure_with(&self, _ctx: &Ctx) -> Self::Units {
+    fn measure_with(&self, _ctx: &Ctx) -> usize {
         self.as_ref().len()
     }
 }
 
 /// The parsing context for converting a byte sequence to a `&str`
 ///
 /// `StrCtx` specifies what byte delimiter to use, and defaults to C-style null terminators. Be careful.
 #[derive(Debug, Copy, Clone)]
@@ -104,59 +99,57 @@ impl Default for StrCtx {
     fn default() -> Self {
         StrCtx::Delimiter(NULL)
     }
 }
 
 impl StrCtx {
     pub fn len(&self) -> usize {
         match *self {
-            StrCtx::Delimiter(_) => 1,
+            StrCtx::Delimiter(_) |
             StrCtx::DelimiterUntil(_, _) => 1,
             StrCtx::Length(_) => 0,
         }
     }
+
+    pub fn is_empty(&self) -> bool {
+        if let StrCtx::Length(_) = *self { true } else { false }
+    }
 }
 
 /// Reads `Self` from `This` using the context `Ctx`; must _not_ fail
 pub trait FromCtx<Ctx: Copy = (), This: ?Sized = [u8]> {
-    #[inline]
     fn from_ctx(this: &This, ctx: Ctx) -> Self;
 }
 
 /// Tries to read `Self` from `This` using the context `Ctx`
 pub trait TryFromCtx<'a, Ctx: Copy = (), This: ?Sized = [u8]> where Self: 'a + Sized {
     type Error;
-    type Size;
-    #[inline]
-    fn try_from_ctx(from: &'a This, ctx: Ctx) -> Result<(Self, Self::Size), Self::Error>;
+    fn try_from_ctx(from: &'a This, ctx: Ctx) -> Result<(Self, usize), Self::Error>;
 }
 
 /// Writes `Self` into `This` using the context `Ctx`
 pub trait IntoCtx<Ctx: Copy = (), This: ?Sized = [u8]>: Sized {
-    fn into_ctx(self, &mut This, ctx: Ctx);
+    fn into_ctx(self, _: &mut This, ctx: Ctx);
 }
 
 /// Tries to write `Self` into `This` using the context `Ctx`
 pub trait TryIntoCtx<Ctx: Copy = (), This: ?Sized = [u8]>: Sized {
     type Error;
-    type Size;
-    fn try_into_ctx(self, &mut This, ctx: Ctx) -> Result<Self::Size, Self::Error>;
+    fn try_into_ctx(self, _: &mut This, ctx: Ctx) -> Result<usize, Self::Error>;
 }
 
 /// Gets the size of `Self` with a `Ctx`, and in `Self::Units`. Implementors can then call `Gread` related functions
 ///
 /// The rationale behind this trait is to:
 ///
 /// 1. Prevent `gread` from being used, and the offset being modified based on simply the sizeof the value, which can be a misnomer, e.g., for Leb128, etc.
 /// 2. Allow a context based size, which is useful for 32/64 bit variants for various containers, etc.
 pub trait SizeWith<Ctx = ()> {
-    type Units;
-    #[inline]
-    fn size_with(ctx: &Ctx) -> Self::Units;
+    fn size_with(ctx: &Ctx) -> usize;
 }
 
 macro_rules! signed_to_unsigned {
     (i8) =>  {u8 };
     (u8) =>  {u8 };
     (i16) => {u16};
     (u16) => {u16};
     (i32) => {u32};
@@ -191,32 +184,30 @@ macro_rules! into_ctx_impl {
         impl<'a> IntoCtx<Endian> for &'a $typ {
             #[inline]
             fn into_ctx(self, dst: &mut [u8], le: Endian) {
                 (*self).into_ctx(dst, le)
             }
         }
         impl TryIntoCtx<Endian> for $typ where $typ: IntoCtx<Endian> {
             type Error = error::Error;
-            type Size = usize;
             #[inline]
-            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<Self::Size> {
+            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<usize> {
                 if $size > dst.len () {
                     Err(error::Error::TooBig{size: $size, len: dst.len()})
                 } else {
                     <$typ as IntoCtx<Endian>>::into_ctx(self, dst, le);
                     Ok($size)
                 }
             }
         }
         impl<'a> TryIntoCtx<Endian> for &'a $typ {
             type Error = error::Error;
-            type Size = usize;
             #[inline]
-            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<Self::Size> {
+            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<usize> {
                 (*self).try_into_ctx(dst, le)
             }
         }
     }
 }
 
 macro_rules! from_ctx_impl {
     ($typ:tt, $size:expr) => {
@@ -231,20 +222,19 @@ macro_rules! from_ctx_impl {
                         &mut data as *mut signed_to_unsigned!($typ) as *mut u8,
                         $size);
                 }
                 (if le.is_little() { data.to_le() } else { data.to_be() }) as $typ
             }
         }
 
         impl<'a> TryFromCtx<'a, Endian> for $typ where $typ: FromCtx<Endian> {
-            type Error = error::Error<usize>;
-            type Size = usize;
+            type Error = error::Error;
             #[inline]
-            fn try_from_ctx(src: &'a [u8], le: Endian) -> result::Result<(Self, Self::Size), Self::Error> {
+            fn try_from_ctx(src: &'a [u8], le: Endian) -> result::Result<(Self, usize), Self::Error> {
                 if $size > src.len () {
                     Err(error::Error::TooBig{size: $size, len: src.len()})
                 } else {
                     Ok((FromCtx::from_ctx(&src, le), $size))
                 }
             }
         }
         // as ref
@@ -261,19 +251,18 @@ macro_rules! from_ctx_impl {
                         $size);
                 }
                 (if le.is_little() { data.to_le() } else { data.to_be() }) as $typ
             }
         }
 
         impl<'a, T> TryFromCtx<'a, Endian, T> for $typ where $typ: FromCtx<Endian, T>, T: AsRef<[u8]> {
             type Error = error::Error;
-            type Size = usize;
             #[inline]
-            fn try_from_ctx(src: &'a T, le: Endian) -> result::Result<(Self, Self::Size), Self::Error> {
+            fn try_from_ctx(src: &'a T, le: Endian) -> result::Result<(Self, usize), Self::Error> {
                 let src = src.as_ref();
                 Self::try_from_ctx(src, le)
             }
         }
     };
 }
 
 macro_rules! ctx_impl {
@@ -285,19 +274,17 @@ macro_rules! ctx_impl {
 ctx_impl!(u8,  1);
 ctx_impl!(i8,  1);
 ctx_impl!(u16, 2);
 ctx_impl!(i16, 2);
 ctx_impl!(u32, 4);
 ctx_impl!(i32, 4);
 ctx_impl!(u64, 8);
 ctx_impl!(i64, 8);
-#[cfg(rust_1_26)]
 ctx_impl!(u128, 16);
-#[cfg(rust_1_26)]
 ctx_impl!(i128, 16);
 
 macro_rules! from_ctx_float_impl {
     ($typ:tt, $size:expr) => {
         impl<'a> FromCtx<Endian> for $typ {
             #[inline]
             fn from_ctx(src: &[u8], le: Endian) -> Self {
                 assert!(src.len() >= ::core::mem::size_of::<Self>());
@@ -308,19 +295,18 @@ macro_rules! from_ctx_float_impl {
                         &mut data as *mut signed_to_unsigned!($typ) as *mut u8,
                         $size);
                     transmute(if le.is_little() { data.to_le() } else { data.to_be() })
                 }
             }
         }
         impl<'a> TryFromCtx<'a, Endian> for $typ where $typ: FromCtx<Endian> {
             type Error = error::Error;
-            type Size = usize;
             #[inline]
-            fn try_from_ctx(src: &'a [u8], le: Endian) -> result::Result<(Self, Self::Size), Self::Error> {
+            fn try_from_ctx(src: &'a [u8], le: Endian) -> result::Result<(Self, usize), Self::Error> {
                 if $size > src.len () {
                     Err(error::Error::TooBig{size: $size, len: src.len()})
                 } else {
                     Ok((FromCtx::from_ctx(src, le), $size))
                 }
             }
         }
     }
@@ -332,19 +318,17 @@ from_ctx_float_impl!(f64, 8);
 into_ctx_impl!(u8,  1);
 into_ctx_impl!(i8,  1);
 into_ctx_impl!(u16, 2);
 into_ctx_impl!(i16, 2);
 into_ctx_impl!(u32, 4);
 into_ctx_impl!(i32, 4);
 into_ctx_impl!(u64, 8);
 into_ctx_impl!(i64, 8);
-#[cfg(rust_1_26)]
 into_ctx_impl!(u128, 16);
-#[cfg(rust_1_26)]
 into_ctx_impl!(i128, 16);
 
 macro_rules! into_ctx_float_impl {
     ($typ:tt, $size:expr) => {
         impl IntoCtx<Endian> for $typ {
             #[inline]
             fn into_ctx(self, dst: &mut [u8], le: Endian) {
                 assert!(dst.len() >= $size);
@@ -354,47 +338,44 @@ macro_rules! into_ctx_float_impl {
         impl<'a> IntoCtx<Endian> for &'a $typ {
             #[inline]
             fn into_ctx(self, dst: &mut [u8], le: Endian) {
                 (*self).into_ctx(dst, le)
             }
         }
         impl TryIntoCtx<Endian> for $typ where $typ: IntoCtx<Endian> {
             type Error = error::Error;
-            type Size = usize;
             #[inline]
-            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<Self::Size> {
+            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<usize> {
                 if $size > dst.len () {
                     Err(error::Error::TooBig{size: $size, len: dst.len()})
                 } else {
                     <$typ as IntoCtx<Endian>>::into_ctx(self, dst, le);
                     Ok($size)
                 }
             }
         }
         impl<'a> TryIntoCtx<Endian> for &'a $typ {
             type Error = error::Error;
-            type Size = usize;
             #[inline]
-            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<Self::Size> {
+            fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<usize> {
                 (*self).try_into_ctx(dst, le)
             }
         }
     }
 }
 
 into_ctx_float_impl!(f32, 4);
 into_ctx_float_impl!(f64, 8);
 
 impl<'a> TryFromCtx<'a, StrCtx> for &'a str {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
     /// Read a `&str` from `src` using `delimiter`
-    fn try_from_ctx(src: &'a [u8], ctx: StrCtx) -> Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], ctx: StrCtx) -> Result<(Self, usize), Self::Error> {
         let len = match ctx {
             StrCtx::Length(len) => len,
             StrCtx::Delimiter(delimiter) => src.iter().take_while(|c| **c != delimiter).count(),
             StrCtx::DelimiterUntil(delimiter, len) => {
                 if len > src.len() {
                     return Err(error::Error::TooBig{size: len, len: src.len()});
                 };
                 src
@@ -413,29 +394,27 @@ impl<'a> TryFromCtx<'a, StrCtx> for &'a 
             Ok(res) => Ok((res, len + ctx.len())),
             Err(_) => Err(error::Error::BadInput{size: src.len(), msg: "invalid utf8"})
         }
     }
 }
 
 impl<'a, T> TryFromCtx<'a, StrCtx, T> for &'a str where T: AsRef<[u8]> {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a T, ctx: StrCtx) -> result::Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a T, ctx: StrCtx) -> result::Result<(Self, usize), Self::Error> {
         let src = src.as_ref();
         TryFromCtx::try_from_ctx(src, ctx)
     }
 }
 
 impl<'a> TryIntoCtx for &'a [u8] {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<Self::Size> {
+    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<usize> {
         let src_len = self.len() as isize;
         let dst_len = dst.len() as isize;
         // if src_len < 0 || dst_len < 0 || offset < 0 {
         //     return Err(error::Error::BadOffset(format!("requested operation has negative casts: src len: {} dst len: {} offset: {}", src_len, dst_len, offset)).into())
         // }
         if src_len > dst_len {
             Err(error::Error::TooBig{ size: self.len(), len: dst.len()})
         } else {
@@ -443,48 +422,44 @@ impl<'a> TryIntoCtx for &'a [u8] {
             Ok(self.len())
         }
     }
 }
 
 // TODO: make TryIntoCtx use StrCtx for awesomeness
 impl<'a> TryIntoCtx for &'a str {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_into_ctx(self, dst: &mut [u8], ctx: ()) -> error::Result<Self::Size> {
+    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<usize> {
         let bytes = self.as_bytes();
-        TryIntoCtx::try_into_ctx(bytes, dst, ctx)
+        TryIntoCtx::try_into_ctx(bytes, dst, ())
     }
 }
 
 // TODO: we can make this compile time without size_of call, but compiler probably does that anyway
 macro_rules! sizeof_impl {
     ($ty:ty) => {
         impl SizeWith<Endian> for $ty {
-            type Units = usize;
             #[inline]
             fn size_with(_ctx: &Endian) -> usize {
                 size_of::<$ty>()
             }
         }
     }
 }
 
 sizeof_impl!(u8);
 sizeof_impl!(i8);
 sizeof_impl!(u16);
 sizeof_impl!(i16);
 sizeof_impl!(u32);
 sizeof_impl!(i32);
 sizeof_impl!(u64);
 sizeof_impl!(i64);
-#[cfg(rust_1_26)]
 sizeof_impl!(u128);
-#[cfg(rust_1_26)]
 sizeof_impl!(i128);
 sizeof_impl!(f32);
 sizeof_impl!(f64);
 sizeof_impl!(usize);
 sizeof_impl!(isize);
 
 impl FromCtx<Endian> for usize {
     #[inline]
@@ -492,42 +467,40 @@ impl FromCtx<Endian> for usize {
         let size = ::core::mem::size_of::<Self>();
         assert!(src.len() >= size);
         let mut data: usize = 0;
         unsafe {
             copy_nonoverlapping(
                 src.as_ptr(),
                 &mut data as *mut usize as *mut u8,
                 size);
-            transmute(if le.is_little() { data.to_le() } else { data.to_be() })
+            if le.is_little() { data.to_le() } else { data.to_be() }
         }
     }
 }
 
 impl<'a> TryFromCtx<'a, Endian> for usize where usize: FromCtx<Endian> {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a [u8], le: Endian) -> result::Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], le: Endian) -> result::Result<(Self, usize), Self::Error> {
         let size = ::core::mem::size_of::<usize>();
         if size > src.len () {
-            Err(error::Error::TooBig{size: size, len: src.len()})
+            Err(error::Error::TooBig{size, len: src.len()})
         } else {
             Ok((FromCtx::from_ctx(src, le), size))
         }
     }
 }
 
 impl<'a> TryFromCtx<'a, usize> for &'a[u8] {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a [u8], size: usize) -> result::Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], size: usize) -> result::Result<(Self, usize), Self::Error> {
         if size > src.len () {
-            Err(error::Error::TooBig{size: size, len: src.len()})
+            Err(error::Error::TooBig{size, len: src.len()})
         } else {
             Ok((&src[..size], size))
         }
     }
 }
 
 impl IntoCtx<Endian> for usize {
     #[inline]
@@ -539,65 +512,61 @@ impl IntoCtx<Endian> for usize {
         unsafe {
             copy_nonoverlapping(data, dst.as_mut_ptr(), size);
         }
     }
 }
 
 impl TryIntoCtx<Endian> for usize where usize: IntoCtx<Endian> {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<Self::Size> {
+    fn try_into_ctx(self, dst: &mut [u8], le: Endian) -> error::Result<usize> {
         let size = ::core::mem::size_of::<usize>();
         if size > dst.len() {
-            Err(error::Error::TooBig{size: size, len: dst.len()})
+            Err(error::Error::TooBig{size, len: dst.len()})
         } else {
             <usize as IntoCtx<Endian>>::into_ctx(self, dst, le);
             Ok(size)
         }
     }
 }
 
 #[cfg(feature = "std")]
 impl<'a> TryFromCtx<'a> for &'a CStr {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, usize), Self::Error> {
         let null_byte = match src.iter().position(|b| *b == 0) {
             Some(ix) => ix,
             None => return Err(error::Error::BadInput {
                 size: 0,
                 msg: "The input doesn't contain a null byte",
             })
         };
 
-        let cstr = unsafe { CStr::from_bytes_with_nul_unchecked(&src[..null_byte+1]) };
+        let cstr = unsafe { CStr::from_bytes_with_nul_unchecked(&src[..=null_byte]) };
         Ok((cstr, null_byte+1))
     }
 }
 
 #[cfg(feature = "std")]
 impl<'a> TryFromCtx<'a> for CString {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, usize), Self::Error> {
         let (raw, bytes_read) = <&CStr as TryFromCtx>::try_from_ctx(src, _ctx)?;
         Ok((raw.to_owned(), bytes_read))
     }
 }
 
 #[cfg(feature = "std")]
 impl<'a> TryIntoCtx for &'a CStr {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<Self::Size> {
+    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<usize> {
         let data = self.to_bytes_with_nul();
 
         if dst.len() < data.len() {
             Err(error::Error::TooBig {
                 size: dst.len(),
                 len: data.len(),
             })
         } else {
@@ -608,20 +577,19 @@ impl<'a> TryIntoCtx for &'a CStr {
             Ok(data.len())
         }
     }
 }
 
 #[cfg(feature = "std")]
 impl TryIntoCtx for CString {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<Self::Size> {
-        self.as_c_str().try_into_ctx(dst, _ctx)
+    fn try_into_ctx(self, dst: &mut [u8], _ctx: ()) -> error::Result<usize> {
+        self.as_c_str().try_into_ctx(dst, ())
     }
 }
 
 
 // example of marshalling to bytes, let's wait until const is an option
 // impl FromCtx for [u8; 10] {
 //     fn from_ctx(bytes: &[u8], _ctx: Endian) -> Self {
 //         let mut dst: Self = [0; 10];
--- a/third_party/rust/scroll/src/endian.rs
+++ b/third_party/rust/scroll/src/endian.rs
@@ -33,15 +33,15 @@ impl From<bool> for Endian {
 }
 
 impl Endian {
     #[inline]
     pub fn network() -> Endian {
         NETWORK
     }
     #[inline]
-    pub fn is_little (&self) -> bool {
+    pub fn is_little(&self) -> bool {
         match *self {
             LE => true,
             _ => false,
         }
     }
 }
--- a/third_party/rust/scroll/src/error.rs
+++ b/third_party/rust/scroll/src/error.rs
@@ -3,22 +3,22 @@ use core::result;
 
 #[cfg(feature = "std")]
 use std::io;
 #[cfg(feature = "std")]
 use std::error;
 
 #[derive(Debug)]
 /// A custom Scroll error
-pub enum Error<T = usize> {
+pub enum Error {
     /// The type you tried to read was too big
-    TooBig { size: T, len: T },
+    TooBig { size: usize, len: usize },
     /// The requested offset to read/write at is invalid
-    BadOffset(T),
-    BadInput{ size: T, msg: &'static str },
+    BadOffset(usize),
+    BadInput{ size: usize, msg: &'static str },
     #[cfg(feature = "std")]
     /// A custom Scroll error for reporting messages to clients
     Custom(String),
     #[cfg(feature = "std")]
     /// Returned when IO based errors are encountered
     IO(io::Error),
 }
 
@@ -28,23 +28,23 @@ impl error::Error for Error {
         match *self {
             Error::TooBig{ .. } => { "TooBig" }
             Error::BadOffset(_) => { "BadOffset" }
             Error::BadInput{ .. } => { "BadInput" }
             Error::Custom(_) => { "Custom" }
             Error::IO(_) => { "IO" }
         }
     }
-    fn cause(&self) -> Option<&error::Error> {
+    fn cause(&self) -> Option<&dyn error::Error> {
         match *self {
             Error::TooBig{ .. } => { None }
             Error::BadOffset(_) => { None }
             Error::BadInput{ .. } => { None }
             Error::Custom(_) => { None }
-            Error::IO(ref io) => { io.cause() }
+            Error::IO(ref io) => { io.source() }
         }
     }
 }
 
 #[cfg(feature = "std")]
 impl From<io::Error> for Error {
     fn from(err: io::Error) -> Error {
         Error::IO(err)
--- a/third_party/rust/scroll/src/greater.rs
+++ b/third_party/rust/scroll/src/greater.rs
@@ -1,11 +1,11 @@
 use core::ops::{Index, IndexMut, RangeFrom};
 
-use ctx::{FromCtx, IntoCtx};
+use crate::ctx::{FromCtx, IntoCtx};
 
 /// Core-read - core, no_std friendly trait for reading basic traits from byte buffers. Cannot fail unless the buffer is too small, in which case an assert fires and the program panics.
 ///
 /// If your type implements [FromCtx](trait.FromCtx.html) then you can `cread::<YourType>(offset)`.
 ///
 /// # Example
 ///
 /// ```rust
@@ -47,17 +47,17 @@ pub trait Cread<Ctx, I = usize> : Index<
     ///
     /// let bytes = [0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xef,0xbe,0xad,0xde,];
     /// let foo = bytes.cread_with::<i64>(0, BE);
     /// let bar = bytes.cread_with::<u32>(8, LE);
     /// assert_eq!(foo, MAX);
     /// assert_eq!(bar, 0xdeadbeef);
     /// ```
     #[inline]
-    fn cread_with<'a, N: FromCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output>>(&'a self, offset: I, ctx: Ctx) -> N {
+    fn cread_with<N: FromCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output>>(&self, offset: I, ctx: Ctx) -> N {
         N::from_ctx(&self[offset..], ctx)
     }
     /// Reads a value implementing `FromCtx` from `Self` at `offset`,
     /// with the **target machine**'s endianness.
     /// For the primitive types, this will be the **target machine**'s endianness.
     ///
     /// # Example
     ///
@@ -73,17 +73,17 @@ pub trait Cread<Ctx, I = usize> : Index<
     /// assert_eq!(foo, 0x100_0000_0000_0000);
     ///
     /// #[cfg(target_endian = "little")]
     /// assert_eq!(bar, 0xbeef);
     /// #[cfg(target_endian = "big")]
     /// assert_eq!(bar, 0xefbe0000);
     /// ```
     #[inline]
-    fn cread<'a, N: FromCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output>>(&'a self, offset: I) -> N where Ctx: Default {
+    fn cread<N: FromCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output>>(&self, offset: I) -> N where Ctx: Default {
         let ctx = Ctx::default();
         N::from_ctx(&self[offset..], ctx)
     }
 }
 
 impl<Ctx: Copy, I, R: ?Sized + Index<I> + Index<RangeFrom<I>>> Cread<Ctx, I> for R {}
 
 /// Core-write - core, no_std friendly trait for writing basic types into byte buffers. Cannot fail unless the buffer is too small, in which case an assert fires and the program panics.
--- a/third_party/rust/scroll/src/leb128.rs
+++ b/third_party/rust/scroll/src/leb128.rs
@@ -1,14 +1,14 @@
 use core::u8;
 use core::convert::{From, AsRef};
 use core::result;
-use Pread;
-use ctx::TryFromCtx;
-use error;
+use crate::Pread;
+use crate::ctx::TryFromCtx;
+use crate::error;
 
 #[derive(Debug, PartialEq, Copy, Clone)]
 /// An unsigned leb128 integer
 pub struct Uleb128 {
     value: u64,
     count: usize,
 }
 
@@ -17,17 +17,17 @@ impl Uleb128 {
     /// Return how many bytes this Uleb128 takes up in memory
     pub fn size(&self) -> usize {
         self.count
     }
     #[inline]
     /// Read a variable length u64 from `bytes` at `offset`
     pub fn read(bytes: &[u8], offset: &mut usize) -> error::Result<u64> {
         let tmp = bytes.pread::<Uleb128>(*offset)?;
-        *offset = *offset + tmp.size();
+        *offset += tmp.size();
         Ok(tmp.into())
     }
 }
 
 impl AsRef<u64> for Uleb128 {
     fn as_ref(&self) -> &u64 {
         &self.value
     }
@@ -51,19 +51,18 @@ impl Sleb128 {
     #[inline]
     /// Return how many bytes this Sleb128 takes up in memory
     pub fn size(&self) -> usize {
         self.count
     }
     #[inline]
     /// Read a variable length i64 from `bytes` at `offset`
     pub fn read(bytes: &[u8], offset: &mut usize) -> error::Result<i64> {
-        use Pread;
         let tmp = bytes.pread::<Sleb128>(*offset)?;
-        *offset = *offset + tmp.size();
+        *offset += tmp.size();
         Ok(tmp.into())
     }
 }
 
 impl AsRef<i64> for Sleb128 {
     fn as_ref(&self) -> &i64 {
         &self.value
     }
@@ -88,76 +87,73 @@ fn mask_continuation(byte: u8) -> u8 {
 // #[inline]
 // fn mask_continuation_u64(val: u64) -> u8 {
 //     let byte = val & (u8::MAX as u64);
 //     mask_continuation(byte as u8)
 // }
 
 impl<'a> TryFromCtx<'a> for Uleb128 {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, Self::Size), Self::Error> {
-        use pread::Pread;
+    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, usize), Self::Error> {
         let mut result = 0;
         let mut shift = 0;
         let mut count = 0;
         loop {
             let byte: u8 = src.pread(count)?;
 
             if shift == 63 && byte != 0x00 && byte != 0x01 {
                 return Err(error::Error::BadInput{ size: src.len(), msg: "failed to parse"})
             }
 
-            let low_bits = mask_continuation(byte) as u64;
+            let low_bits = u64::from(mask_continuation(byte));
             result |= low_bits << shift;
 
             count += 1;
             shift += 7;
 
             if byte & CONTINUATION_BIT == 0 {
-                return Ok((Uleb128 { value: result, count: count }, count));
+                return Ok((Uleb128 { value: result, count }, count));
             }
         }
     }
 }
 
 impl<'a> TryFromCtx<'a> for Sleb128 {
     type Error = error::Error;
-    type Size = usize;
     #[inline]
-    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, Self::Size), Self::Error> {
+    fn try_from_ctx(src: &'a [u8], _ctx: ()) -> result::Result<(Self, usize), Self::Error> {
         let o = 0;
         let offset = &mut 0;
         let mut result = 0;
         let mut shift = 0;
         let size = 64;
         let mut byte: u8;
         loop {
             byte = src.gread(offset)?;
 
             if shift == 63 && byte != 0x00 && byte != 0x7f {
                 return Err(error::Error::BadInput{size: src.len(), msg: "failed to parse"})
             }
 
-            let low_bits = mask_continuation(byte) as i64;
+            let low_bits = i64::from(mask_continuation(byte));
             result |= low_bits << shift;
             shift += 7;
 
             if byte & CONTINUATION_BIT == 0 {
                 break;
             }
         }
 
         if shift < size && (SIGN_BIT & byte) == SIGN_BIT {
             // Sign extend the result.
             result |= !0 << shift;
         }
         let count = *offset - o;
-        Ok((Sleb128{ value: result, count: count }, count))
+        Ok((Sleb128{ value: result, count }, count))
     }
 }
 
 #[cfg(test)]
 mod tests {
     use super::{Uleb128, Sleb128};
     use super::super::LE;
 
--- a/third_party/rust/scroll/src/lesser.rs
+++ b/third_party/rust/scroll/src/lesser.rs
@@ -1,10 +1,10 @@
 use std::io::{Result, Read, Write};
-use ctx::{FromCtx, IntoCtx, SizeWith};
+use crate::ctx::{FromCtx, IntoCtx, SizeWith};
 
 /// An extension trait to `std::io::Read` streams; this only deserializes simple types, like `u8`, `i32`, `f32`, `usize`, etc.
 ///
 /// If you implement [`FromCtx`](trait.FromCtx.html) and [`SizeWith`](ctx/trait.SizeWith.html) for your type, you can then `ioread::<YourType>()` on a `Read`.  Note: [`FromCtx`](trait.FromCtx.html) is only meant for very simple types, and should _never_ fail.
 ///
 /// **NB** You should probably add `repr(packed)` or `repr(C)` and be very careful how you implement [`SizeWith`](ctx/trait.SizeWith.html), otherwise you
 /// will get IO errors failing to fill entire buffer (the size you specified in `SizeWith`), or out of bound errors (depending on your impl) in `from_ctx`
 ///
@@ -21,19 +21,18 @@ use ctx::{FromCtx, IntoCtx, SizeWith};
 ///
 /// impl ctx::FromCtx<scroll::Endian> for Foo {
 ///     fn from_ctx(bytes: &[u8], ctx: scroll::Endian) -> Self {
 ///         Foo { foo: bytes.pread_with::<i64>(0, ctx).unwrap(), bar: bytes.pread_with::<u32>(8, ctx).unwrap() }
 ///     }
 /// }
 ///
 /// impl ctx::SizeWith<scroll::Endian> for Foo {
-///     type Units = usize;
 ///     // our parsing context doesn't influence our size
-///     fn size_with(_: &scroll::Endian) -> Self::Units {
+///     fn size_with(_: &scroll::Endian) -> usize {
 ///         ::std::mem::size_of::<Foo>()
 ///     }
 /// }
 ///
 /// let bytes_ = [0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00, 0xef,0xbe,0x00,0x00,];
 /// let mut bytes = Cursor::new(bytes_);
 /// let foo = bytes.ioread_with::<i64>(LE).unwrap();
 /// let bar = bytes.ioread_with::<u32>(LE).unwrap();
@@ -64,17 +63,17 @@ pub trait IOread<Ctx: Copy> : Read
     /// let beef = bytes.ioread::<u16>().unwrap();
     ///
     /// #[cfg(target_endian = "little")]
     /// assert_eq!(0xbeef, beef);
     /// #[cfg(target_endian = "big")]
     /// assert_eq!(0xefbe, beef);
     /// ```
     #[inline]
-    fn ioread<N: FromCtx<Ctx> + SizeWith<Ctx, Units = usize>>(&mut self) -> Result<N> where Ctx: Default {
+    fn ioread<N: FromCtx<Ctx> + SizeWith<Ctx>>(&mut self) -> Result<N> where Ctx: Default {
         let ctx = Ctx::default();
         self.ioread_with(ctx)
     }
 
     /// Reads the type `N` from `Self`, with the parsing context `ctx`.
     /// **NB**: this will panic if the type you're reading has a size greater than 256. Plans are to have this allocate in larger cases.
     ///
     /// For the primitive numeric types, this will be at the host machine's endianness.
@@ -90,17 +89,17 @@ pub trait IOread<Ctx: Copy> : Read
     /// let b0 = bytes.ioread::<u8>().unwrap();
     /// assert_eq!(0xb0, b0);
     /// let b0 = bytes.ioread::<u8>().unwrap();
     /// assert_eq!(0xb0, b0);
     /// let feeddead = bytes.ioread_with::<u32>(BE).unwrap();
     /// assert_eq!(0xfeeddead, feeddead);
     /// ```
     #[inline]
-    fn ioread_with<N: FromCtx<Ctx> + SizeWith<Ctx, Units = usize>>(&mut self, ctx: Ctx) -> Result<N> {
+    fn ioread_with<N: FromCtx<Ctx> + SizeWith<Ctx>>(&mut self, ctx: Ctx) -> Result<N> {
         let mut scratch = [0u8; 256];
         let size = N::size_with(&ctx);
         let mut buf = &mut scratch[0..size];
         self.read_exact(&mut buf)?;
         Ok(N::from_ctx(buf, ctx))
     }
 }
 
@@ -128,17 +127,17 @@ pub trait IOwrite<Ctx: Copy>: Write
     /// bytes.iowrite(0xdeadbeef as u32).unwrap();
     ///
     /// #[cfg(target_endian = "little")]
     /// assert_eq!(bytes.into_inner(), [0xef, 0xbe, 0xad, 0xde,]);
     /// #[cfg(target_endian = "big")]
     /// assert_eq!(bytes.into_inner(), [0xde, 0xad, 0xbe, 0xef,]);
     /// ```
     #[inline]
-    fn iowrite<N: SizeWith<Ctx, Units = usize> + IntoCtx<Ctx>>(&mut self, n: N) -> Result<()> where Ctx: Default {
+    fn iowrite<N: SizeWith<Ctx> + IntoCtx<Ctx>>(&mut self, n: N) -> Result<()> where Ctx: Default {
         let ctx = Ctx::default();
         self.iowrite_with(n, ctx)
     }
 
     /// Writes the type `N` into `Self`, with the parsing context `ctx`.
     /// **NB**: this will panic if the type you're writing has a size greater than 256. Plans are to have this allocate in larger cases.
     ///
     /// For the primitive numeric types, this will be at the host machine's endianness.
@@ -150,17 +149,17 @@ pub trait IOwrite<Ctx: Copy>: Write
     ///
     /// let mut bytes = [0x0u8; 10];
     /// let mut cursor = Cursor::new(&mut bytes[..]);
     /// cursor.write_all(b"hello").unwrap();
     /// cursor.iowrite_with(0xdeadbeef as u32, BE).unwrap();
     /// assert_eq!(cursor.into_inner(), [0x68, 0x65, 0x6c, 0x6c, 0x6f, 0xde, 0xad, 0xbe, 0xef, 0x0]);
     /// ```
     #[inline]
-    fn iowrite_with<N: SizeWith<Ctx, Units = usize> + IntoCtx<Ctx>>(&mut self, n: N, ctx: Ctx) -> Result<()> {
+    fn iowrite_with<N: SizeWith<Ctx> + IntoCtx<Ctx>>(&mut self, n: N, ctx: Ctx) -> Result<()> {
         let mut buf = [0u8; 256];
         let size = N::size_with(&ctx);
         let buf = &mut buf[0..size];
         n.into_ctx(buf, ctx);
         self.write_all(buf)?;
         Ok(())
     }
 }
--- a/third_party/rust/scroll/src/lib.rs
+++ b/third_party/rust/scroll/src/lib.rs
@@ -97,82 +97,76 @@
 //! ```
 //!
 //! # Advanced Uses
 //!
 //! Scroll is designed to be highly configurable - it allows you to implement various context (`Ctx`) sensitive traits, which then grants the implementor _automatic_ uses of the `Pread` and/or `Pwrite` traits.
 //!
 //! For example, suppose we have a datatype and we want to specify how to parse or serialize this datatype out of some arbitrary
 //! byte buffer. In order to do this, we need to provide a [TryFromCtx](trait.TryFromCtx.html) impl for our datatype.
-//! 
+//!
 //! In particular, if we do this for the `[u8]` target, using the convention `(usize, YourCtx)`, you will automatically get access to
 //! calling `pread_with::<YourDatatype>` on arrays of bytes.
-//! 
+//!
 //! ```rust
 //! use scroll::{self, ctx, Pread, BE, Endian};
-//! 
+//!
 //! struct Data<'a> {
 //!   name: &'a str,
 //!   id: u32,
 //! }
-//! 
+//!
 //! // note the lifetime specified here
 //! impl<'a> ctx::TryFromCtx<'a, Endian> for Data<'a> {
 //!   type Error = scroll::Error;
-//!   type Size = usize;
 //!   // and the lifetime annotation on `&'a [u8]` here
 //!   fn try_from_ctx (src: &'a [u8], endian: Endian)
-//!     -> Result<(Self, Self::Size), Self::Error> {
+//!     -> Result<(Self, usize), Self::Error> {
 //!     let offset = &mut 0;
 //!     let name = src.gread::<&str>(offset)?;
 //!     let id = src.gread_with(offset, endian)?;
 //!     Ok((Data { name: name, id: id }, *offset))
 //!   }
 //! }
-//! 
+//!
 //! let bytes = b"UserName\x00\x01\x02\x03\x04";
 //! let data = bytes.pread_with::<Data>(0, BE).unwrap();
 //! assert_eq!(data.id, 0x01020304);
 //! assert_eq!(data.name.to_string(), "UserName".to_string());
 //! ```
 //!
 //! Please see the [Pread documentation examples](trait.Pread.html#implementing-your-own-reader)
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
 #[cfg(feature = "derive")]
 #[allow(unused_imports)]
-#[macro_use]
-extern crate scroll_derive;
-
-#[cfg(feature = "derive")]
-#[doc(hidden)]
-pub use scroll_derive::*;
+pub use scroll_derive::{Pread, Pwrite, SizeWith, IOread, IOwrite};
 
 #[cfg(feature = "std")]
 extern crate core;
 
 pub mod ctx;
 mod pread;
 mod pwrite;
 mod greater;
 mod error;
 mod endian;
 mod leb128;
 #[cfg(feature = "std")]
 mod lesser;
 
-pub use endian::*;
-pub use pread::*;
-pub use pwrite::*;
-pub use greater::*;
-pub use error::*;
-pub use leb128::*;
+pub use crate::endian::*;
+pub use crate::pread::*;
+pub use crate::pwrite::*;
+pub use crate::greater::*;
+pub use crate::error::*;
+pub use crate::leb128::*;
 #[cfg(feature = "std")]
-pub use lesser::*;
+pub use crate::lesser::*;
 
 #[doc(hidden)]
 pub mod export {
     pub use ::core::result;
     pub use ::core::mem;
 }
 
 #[cfg(test)]
@@ -328,46 +322,44 @@ mod tests {
             write!(fmt, "ExternalError")
         }
     }
 
     impl error::Error for ExternalError {
         fn description(&self) -> &str {
             "ExternalError"
         }
-        fn cause(&self) -> Option<&error::Error> { None}
+        fn cause(&self) -> Option<&dyn error::Error> { None}
     }
 
     impl From<super::Error> for ExternalError {
         fn from(err: super::Error) -> Self {
             //use super::Error::*;
             match err {
                 _ => ExternalError{},
             }
         }
     }
 
     #[derive(Debug, PartialEq, Eq)]
     pub struct Foo(u16);
 
     impl super::ctx::TryIntoCtx<super::Endian> for Foo {
         type Error = ExternalError;
-        type Size = usize;
-        fn try_into_ctx(self, this: &mut [u8], le: super::Endian) -> Result<Self::Size, Self::Error> {
+        fn try_into_ctx(self, this: &mut [u8], le: super::Endian) -> Result<usize, Self::Error> {
             use super::Pwrite;
             if this.len() < 2 { return Err((ExternalError {}).into()) }
             this.pwrite_with(self.0, 0, le)?;
             Ok(2)
         }
     }
 
     impl<'a> super::ctx::TryFromCtx<'a, super::Endian> for Foo {
         type Error = ExternalError;
-        type Size = usize;
-        fn try_from_ctx(this: &'a [u8], le: super::Endian) -> Result<(Self, Self::Size), Self::Error> {
+        fn try_from_ctx(this: &'a [u8], le: super::Endian) -> Result<(Self, usize), Self::Error> {
             use super::Pread;
             if this.len() > 2 { return Err((ExternalError {}).into()) }
             let n = this.pread_with(0, le)?;
             Ok((Foo(n), 2))
         }
     }
 
     #[test]
--- a/third_party/rust/scroll/src/pread.rs
+++ b/third_party/rust/scroll/src/pread.rs
@@ -1,30 +1,29 @@
 use core::result;
-use core::ops::{Index, RangeFrom, Add, AddAssign};
+use core::ops::{Index, RangeFrom};
 
-use ctx::{TryFromCtx, MeasureWith};
-use error;
+use crate::ctx::{TryFromCtx, MeasureWith};
+use crate::error;
 
 /// A very generic, contextual pread interface in Rust. Allows completely parallelized reads, as `Self` is immutable
 ///
 /// Don't be scared! The `Pread` definition _is_ terrifying, but it is definitely tractable. Essentially, `E` is the error, `Ctx` the parsing context, `I` is the indexing type, `TryCtx` is the "offset + ctx" Context given to the `TryFromCtx` trait bounds, and `SliceCtx` is the "offset + size + ctx" context given to the `TryRefFromCtx` trait bound.
 ///
 /// # Implementing Your Own Reader
 /// If you want to implement your own reader for a type `Foo` from some kind of buffer (say `[u8]`), then you need to implement [TryFromCtx](trait.TryFromCtx.html)
 ///
 /// ```rust
 /// use scroll::{self, ctx, Pread};
 /// #[derive(Debug, PartialEq, Eq)]
 /// pub struct Foo(u16);
 ///
 /// impl<'a> ctx::TryFromCtx<'a, scroll::Endian> for Foo {
 ///      type Error = scroll::Error;
-///      type Size = usize;
-///      fn try_from_ctx(this: &'a [u8], le: scroll::Endian) -> Result<(Self, Self::Size), Self::Error> {
+///      fn try_from_ctx(this: &'a [u8], le: scroll::Endian) -> Result<(Self, usize), Self::Error> {
 ///          if this.len() < 2 { return Err((scroll::Error::Custom("whatever".to_string())).into()) }
 ///          let n = this.pread_with(0, le)?;
 ///          Ok((Foo(n), 2))
 ///      }
 /// }
 ///
 /// let bytes: [u8; 4] = [0xde, 0xad, 0, 0];
 /// let foo = bytes.pread_with::<Foo>(0, scroll::LE).unwrap();
@@ -63,86 +62,84 @@ use error;
 ///          }
 ///      }
 ///  }
 ///  #[derive(Debug, PartialEq, Eq)]
 ///  pub struct Foo(u16);
 ///
 ///  impl<'a> ctx::TryFromCtx<'a, scroll::Endian> for Foo {
 ///      type Error = ExternalError;
-///      type Size = usize;
-///      fn try_from_ctx(this: &'a [u8], le: scroll::Endian) -> Result<(Self, Self::Size), Self::Error> {
+///      fn try_from_ctx(this: &'a [u8], le: scroll::Endian) -> Result<(Self, usize), Self::Error> {
 ///          if this.len() <= 2 { return Err((ExternalError {}).into()) }
 ///          let offset = &mut 0;
 ///          let n = this.gread_with(offset, le)?;
 ///          Ok((Foo(n), *offset))
 ///      }
 ///  }
 ///
 /// let bytes: [u8; 4] = [0xde, 0xad, 0, 0];
 /// let foo: Result<Foo, ExternalError> = bytes.pread(0);
 /// ```
-pub trait Pread<Ctx, E, I = usize> : Index<I> + Index<RangeFrom<I>> + MeasureWith<Ctx, Units = I>
+pub trait Pread<Ctx, E> : Index<usize> + Index<RangeFrom<usize>> + MeasureWith<Ctx>
  where
        Ctx: Copy,
-       I: Add + Copy + PartialOrd,
-       E: From<error::Error<I>>,
+       E: From<error::Error>,
 {
     #[inline]
     /// Reads a value from `self` at `offset` with a default `Ctx`. For the primitive numeric values, this will read at the machine's endianness.
     /// # Example
     /// ```rust
     /// use scroll::Pread;
     /// let bytes = [0x7fu8; 0x01];
     /// let byte = bytes.pread::<u8>(0).unwrap();
-    fn pread<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>(&'a self, offset: I) -> result::Result<N, E> where <Self as Index<RangeFrom<I>>>::Output: 'a, Ctx: Default {
+    fn pread<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&'a self, offset: usize) -> result::Result<N, E> where <Self as Index<RangeFrom<usize>>>::Output: 'a, Ctx: Default {
         self.pread_with(offset, Ctx::default())
     }
     #[inline]
     /// Reads a value from `self` at `offset` with the given `ctx`
     /// # Example
     /// ```rust
     /// use scroll::Pread;
     /// let bytes: [u8; 2] = [0xde, 0xad];
     /// let dead: u16 = bytes.pread_with(0, scroll::BE).unwrap();
     /// assert_eq!(dead, 0xdeadu16);
-    fn pread_with<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>(&'a self, offset: I, ctx: Ctx) -> result::Result<N, E> where <Self as Index<RangeFrom<I>>>::Output: 'a {
+    fn pread_with<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&'a self, offset: usize, ctx: Ctx) -> result::Result<N, E> where <Self as Index<RangeFrom<usize>>>::Output: 'a {
         let len = self.measure_with(&ctx);
         if offset >= len {
             return Err(error::Error::BadOffset(offset).into())
         }
         N::try_from_ctx(&self[offset..], ctx).and_then(|(n, _)| Ok(n))
     }
     #[inline]
     /// Reads a value from `self` at `offset` with a default `Ctx`. For the primitive numeric values, this will read at the machine's endianness. Updates the offset
     /// # Example
     /// ```rust
     /// use scroll::Pread;
     /// let offset = &mut 0;
     /// let bytes = [0x7fu8; 0x01];
     /// let byte = bytes.gread::<u8>(offset).unwrap();
     /// assert_eq!(*offset, 1);
-    fn gread<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>(&'a self, offset: &mut I) -> result::Result<N, E> where I: AddAssign, Ctx: Default, <Self as Index<RangeFrom<I>>>::Output: 'a {
+    fn gread<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&'a self, offset: &mut usize) -> result::Result<N, E> where Ctx: Default, <Self as Index<RangeFrom<usize>>>::Output: 'a {
         let ctx = Ctx::default();
         self.gread_with(offset, ctx)
     }
     /// Reads a value from `self` at `offset` with the given `ctx`, and updates the offset.
     /// # Example
     /// ```rust
     /// use scroll::Pread;
     /// let offset = &mut 0;
     /// let bytes: [u8; 2] = [0xde, 0xad];
     /// let dead: u16 = bytes.gread_with(offset, scroll::BE).unwrap();
     /// assert_eq!(dead, 0xdeadu16);
     /// assert_eq!(*offset, 2);
     #[inline]
-    fn gread_with<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>
-        (&'a self, offset: &mut I, ctx: Ctx) ->
+    fn gread_with<'a, N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>
+        (&'a self, offset: &mut usize, ctx: Ctx) ->
         result::Result<N, E>
-        where I: AddAssign, <Self as Index<RangeFrom<I>>>::Output: 'a
+        where <Self as Index<RangeFrom<usize>>>::Output: 'a
     {
         let o = *offset;
         // self.pread_with(o, ctx).and_then(|(n, size)| {
         //     *offset += size;
         //     Ok(n)
         // })
         let len = self.measure_with(&ctx);
         if o >= len {
@@ -160,52 +157,47 @@ pub trait Pread<Ctx, E, I = usize> : Ind
     /// use scroll::Pread;
     /// let mut bytes: Vec<u8> = vec![0, 0];
     /// let offset = &mut 0;
     /// let bytes_from: [u8; 2] = [0x48, 0x49];
     /// bytes_from.gread_inout(offset, &mut bytes).unwrap();
     /// assert_eq!(&bytes, &bytes_from);
     /// assert_eq!(*offset, 2);
     #[inline]
-    fn gread_inout<'a, N>(&'a self, offset: &mut I, inout: &mut [N]) -> result::Result<(), E>
+    fn gread_inout<'a, N>(&'a self, offset: &mut usize, inout: &mut [N]) -> result::Result<(), E>
         where
-        I: AddAssign,
-        N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>,
+        N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>,
     Ctx: Default,
-    <Self as Index<RangeFrom<I>>>::Output: 'a
+    <Self as Index<RangeFrom<usize>>>::Output: 'a
     {
-        let len = inout.len();
-        for i in 0..len {
-            inout[i] = self.gread(offset)?;
+        for i in inout.iter_mut() {
+            *i = self.gread(offset)?;
         }
         Ok(())
     }
 
     /// Trys to write `inout.len()` `N`s into `inout` from `Self` starting at `offset`, using the context `ctx`
     /// # Example
     /// ```rust
     /// use scroll::{ctx, LE, Pread};
     /// let mut bytes: Vec<u8> = vec![0, 0];
     /// let offset = &mut 0;
     /// let bytes_from: [u8; 2] = [0x48, 0x49];
     /// bytes_from.gread_inout_with(offset, &mut bytes, LE).unwrap();
     /// assert_eq!(&bytes, &bytes_from);
     /// assert_eq!(*offset, 2);
     #[inline]
-    fn gread_inout_with<'a, N>(&'a self, offset: &mut I, inout: &mut [N], ctx: Ctx) -> result::Result<(), E>
+    fn gread_inout_with<'a, N>(&'a self, offset: &mut usize, inout: &mut [N], ctx: Ctx) -> result::Result<(), E>
         where
-        I: AddAssign,
-        N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>,
-    <Self as Index<RangeFrom<I>>>::Output: 'a
+        N: TryFromCtx<'a, Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>,
+    <Self as Index<RangeFrom<usize>>>::Output: 'a
     {
-        let len = inout.len();
-        for i in 0..len {
-            inout[i] = self.gread_with(offset, ctx)?;
+        for i in inout.iter_mut() {
+            *i = self.gread_with(offset, ctx)?;
         }
         Ok(())
     }
 }
 
 impl<Ctx: Copy,
-     I: Add + Copy + PartialOrd,
-     E: From<error::Error<I>>,
-     R: ?Sized + Index<I> + Index<RangeFrom<I>> + MeasureWith<Ctx, Units = I>>
-    Pread<Ctx, E, I> for R {}
+     E: From<error::Error>,
+     R: ?Sized + Index<usize> + Index<RangeFrom<usize>> + MeasureWith<Ctx>>
+    Pread<Ctx, E> for R {}
--- a/third_party/rust/scroll/src/pwrite.rs
+++ b/third_party/rust/scroll/src/pwrite.rs
@@ -1,85 +1,79 @@
 use core::result;
-use core::ops::{Index, IndexMut, RangeFrom, Add, AddAssign};
+use core::ops::{Index, IndexMut, RangeFrom};
 
-use ctx::{TryIntoCtx, MeasureWith};
-use error;
+use crate::ctx::{TryIntoCtx, MeasureWith};
+use crate::error;
 
 /// Writes into `Self` at an offset of type `I` using a `Ctx`
 ///
 /// To implement writing into an arbitrary byte buffer, implement `TryIntoCtx`
 /// # Example
 /// ```rust
 /// use scroll::{self, ctx, LE, Endian, Pwrite};
 /// #[derive(Debug, PartialEq, Eq)]
 /// pub struct Foo(u16);
 ///
 /// // this will use the default `DefaultCtx = scroll::Endian` and `I = usize`...
 /// impl ctx::TryIntoCtx<Endian> for Foo {
 ///     // you can use your own error here too, but you will then need to specify it in fn generic parameters
 ///     type Error = scroll::Error;
-///     type Size = usize;
 ///     // you can write using your own context too... see `leb128.rs`
-///     fn try_into_ctx(self, this: &mut [u8], le: Endian) -> Result<Self::Size, Self::Error> {
+///     fn try_into_ctx(self, this: &mut [u8], le: Endian) -> Result<usize, Self::Error> {
 ///         if this.len() < 2 { return Err((scroll::Error::Custom("whatever".to_string())).into()) }
 ///         this.pwrite_with(self.0, 0, le)?;
 ///         Ok(2)
 ///     }
 /// }
 /// // now we can write a `Foo` into some buffer (in this case, a byte buffer, because that's what we implemented it for above)
 ///
 /// let mut bytes: [u8; 4] = [0, 0, 0, 0];
 /// bytes.pwrite_with(Foo(0x7f), 1, LE).unwrap();
 ///
-pub trait Pwrite<Ctx, E, I = usize> : Index<I> + IndexMut<RangeFrom<I>> + MeasureWith<Ctx, Units = I>
+pub trait Pwrite<Ctx, E> : Index<usize> + IndexMut<RangeFrom<usize>> + MeasureWith<Ctx>
  where
        Ctx: Copy,
-       I: Add + Copy + PartialOrd,
-       E: From<error::Error<I>>,
+       E: From<error::Error>,
 {
-    fn pwrite<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>(&mut self, n: N, offset: I) -> result::Result<I, E> where Ctx: Default {
+    fn pwrite<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&mut self, n: N, offset: usize) -> result::Result<usize, E> where Ctx: Default {
         self.pwrite_with(n, offset, Ctx::default())
     }
     /// Write `N` at offset `I` with context `Ctx`
     /// # Example
     /// ```
     /// use scroll::{Pwrite, Pread, LE};
     /// let mut bytes: [u8; 8] = [0, 0, 0, 0, 0, 0, 0, 0];
     /// bytes.pwrite_with::<u32>(0xbeefbeef, 0, LE).unwrap();
     /// assert_eq!(bytes.pread_with::<u32>(0, LE).unwrap(), 0xbeefbeef);
-    fn pwrite_with<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>(&mut self, n: N, offset: I, ctx: Ctx) -> result::Result<I, E> {
+    fn pwrite_with<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&mut self, n: N, offset: usize, ctx: Ctx) -> result::Result<usize, E> {
         let len = self.measure_with(&ctx);
         if offset >= len {
             return Err(error::Error::BadOffset(offset).into())
         }
         let dst = &mut self[offset..];
         n.try_into_ctx(dst, ctx)
     }
     /// Write `n` into `self` at `offset`, with a default `Ctx`. Updates the offset.
     #[inline]
-    fn gwrite<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output,  Error = E, Size = I>>(&mut self, n: N, offset: &mut I) -> result::Result<I, E> where
-        I: AddAssign,
+    fn gwrite<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&mut self, n: N, offset: &mut usize) -> result::Result<usize, E> where
         Ctx: Default {
         let ctx = Ctx::default();
         self.gwrite_with(n, offset, ctx)
     }
     /// Write `n` into `self` at `offset`, with the `ctx`. Updates the offset.
     #[inline]
-    fn gwrite_with<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<I>>>::Output, Error = E, Size = I>>(&mut self, n: N, offset: &mut I, ctx: Ctx) -> result::Result<I, E>
-        where I: AddAssign,
-    {
+    fn gwrite_with<N: TryIntoCtx<Ctx, <Self as Index<RangeFrom<usize>>>::Output, Error = E>>(&mut self, n: N, offset: &mut usize, ctx: Ctx) -> result::Result<usize, E> {
         let o = *offset;
         match self.pwrite_with(n, o, ctx) {
             Ok(size) => {
                 *offset += size;
                 Ok(size)
             },
             err => err
         }
     }
 }
 
 impl<Ctx: Copy,
-     I: Add + Copy + PartialOrd,
-     E: From<error::Error<I>>,
-     R: ?Sized + Index<I> + IndexMut<RangeFrom<I>> + MeasureWith<Ctx, Units = I>>
-    Pwrite<Ctx, E, I> for R {}
+     E: From<error::Error>,
+     R: ?Sized + Index<usize> + IndexMut<RangeFrom<usize>> + MeasureWith<Ctx>>
+    Pwrite<Ctx, E> for R {}
--- a/third_party/rust/scroll/tests/api.rs
+++ b/third_party/rust/scroll/tests/api.rs
@@ -1,22 +1,21 @@
 // this exists primarily to test various API usages of scroll; e.g., must compile
 
 // guard against potential undefined behaviour when borrowing from
 // packed structs. See https://github.com/rust-lang/rust/issues/46043
 #![deny(safe_packed_borrows)]
 
-extern crate scroll;
-
 // #[macro_use] extern crate scroll_derive;
 
 use std::ops::{Deref,  DerefMut};
 use scroll::{ctx, Result, Cread, Pread};
 use scroll::ctx::SizeWith;
 
+#[derive(Default)]
 pub struct Section<'a> {
     pub sectname:  [u8; 16],
     pub segname:   [u8; 16],
     pub addr:      u64,
     pub size:      u64,
     pub offset:    u32,
     pub align:     u32,
     pub reloff:    u32,
@@ -30,17 +29,16 @@ impl<'a> Section<'a> {
         self.sectname.pread::<&str>(0)
     }
     pub fn segname(&self) -> Result<&str> {
         self.segname.pread::<&str>(0)
     }
 }
 
 impl<'a> ctx::SizeWith for Section<'a> {
-    type Units = usize;
     fn size_with(_ctx: &()) -> usize {
         4
     }
 }
 
 #[repr(C)]
 // renable when scroll_derive Pread/Pwrite matches
 //#[derive(Debug, Clone, Copy, Pread, Pwrite)]
@@ -56,20 +54,18 @@ pub struct Section32 {
     pub nreloc:    u32,
     pub flags:     u32,
     pub reserved1: u32,
     pub reserved2: u32,
 }
 
 impl<'a> ctx::TryFromCtx<'a, ()> for Section<'a> {
     type Error = scroll::Error;
-    type Size = usize;
-    fn try_from_ctx(_bytes: &'a [u8], _ctx: ()) -> ::std::result::Result<(Self, Self::Size), Self::Error> {
-        //let section = Section::from_ctx(bytes, bytes.pread_with::<Section32>(offset, ctx)?);
-        let section = unsafe { ::std::mem::uninitialized::<Section>()};
+    fn try_from_ctx(_bytes: &'a [u8], _ctx: ()) -> ::std::result::Result<(Self, usize), Self::Error> {
+        let section = Section::default();
         Ok((section, ::std::mem::size_of::<Section>()))
     }
 }
 
 pub struct Segment<'a> {
     pub cmd:      u32,
     pub cmdsize:  u32,
     pub segname:  [u8; 16],
@@ -101,17 +97,16 @@ impl<'a> Segment<'a> {
             sections.push(section);
             //offset += size;
         }
         Ok(sections)
     }
 }
 
 impl<'a> ctx::SizeWith for Segment<'a> {
-    type Units = usize;
     fn size_with(_ctx: &()) -> usize {
         4
     }
 }
 
 pub struct Segments<'a> {
     pub segments: Vec<Segment<'a>>,
 }
@@ -181,18 +176,17 @@ struct Foo {
 
 impl scroll::ctx::FromCtx<scroll::Endian> for Foo {
     fn from_ctx(bytes: &[u8], ctx: scroll::Endian) -> Self {
         Foo { foo: bytes.cread_with::<i64>(0, ctx), bar: bytes.cread_with::<u32>(8, ctx) }
     }
 }
 
 impl scroll::ctx::SizeWith<scroll::Endian> for Foo {
-    type Units = usize;
-    fn size_with(_: &scroll::Endian) -> Self::Units {
+    fn size_with(_: &scroll::Endian) -> usize {
         ::std::mem::size_of::<Foo>()
     }
 }
 
 #[test]
 fn ioread_api() {
     use std::io::Cursor;
     use scroll::{LE, IOread};
@@ -213,17 +207,16 @@ fn ioread_api() {
 #[repr(packed)]
 struct Bar {
     foo: i32,
     bar: u32,
 }
 
 impl scroll::ctx::FromCtx<scroll::Endian> for Bar {
     fn from_ctx(bytes: &[u8], ctx: scroll::Endian) -> Self {
-        use scroll::Cread;
         Bar { foo: bytes.cread_with(0, ctx), bar: bytes.cread_with(4, ctx) }
     }
 }
 
 #[test]
 fn cread_api() {
     use scroll::{LE, Cread};
     let bytes = [0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xef,0xbe,0x00,0x00,];
--- a/third_party/rust/scroll/tests/readme.rs
+++ b/third_party/rust/scroll/tests/readme.rs
@@ -19,10 +19,11 @@ fn readme_test() {
         .arg("--extern")
         .arg(&extern_arg)
         .arg(&readme);
     println!("Running `{:?}`", cmd);
     let result = cmd.spawn()
         .expect("Failed to spawn process")
         .wait()
         .expect("Failed to run process");
-    assert!(result.success(), "Failed to run rustdoc tests on README.md!");
+    // fixme: i dont know why this is failing, so disabling
+    // assert!(result.success(), "Failed to run rustdoc tests on README.md!");
 }
--- a/third_party/rust/scroll_derive/.cargo-checksum.json
+++ b/third_party/rust/scroll_derive/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"3ccdb940e367335cb217c5f5d5dd75b7fadc3aae1d2a63a77dcbbcf724ab0aca","LICENSE":"afb11426e09da40a1ae4f8fa17ddcc6b6a52d14df04c29bc5bcd06eb8730624d","README.md":"f89c7768454b0d2b9db816afe05db3a4cea1125bef87f08ed3eefd65e9e2b180","examples/main.rs":"776199a415860055355dbacc12b2f3020abb8c685e4aca34d0a97e77ea41810e","src/lib.rs":"e02c31be394ba69ca5a407cb3c4a63b53ba7924d9a495bd88938268a73912ecb","tests/tests.rs":"6663b2ce835146785df06b0e98b7213f31d2a227290918123224171c03d04dff"},"package":"8f1aa96c45e7f5a91cb7fabe7b279f02fea7126239fc40b732316e8b6a2d0fcb"}
\ No newline at end of file
+{"files":{"Cargo.lock":"7939ddcf9d89578f0d23b29d75787bcb29ea2fb4573ad560b1a5d572847557b9","Cargo.toml":"2d811c7f55b02b5fd6d0157e1f73ffdc6acd9c1fa5496840a5bdf3d253a6a5cd","LICENSE":"afb11426e09da40a1ae4f8fa17ddcc6b6a52d14df04c29bc5bcd06eb8730624d","README.md":"f89c7768454b0d2b9db816afe05db3a4cea1125bef87f08ed3eefd65e9e2b180","examples/main.rs":"2e47cff7ea4946dd7fe58847edb132998d1e1936dfe7e1b65f80425d5db4f398","src/lib.rs":"dccab946a64e2a8ff0a91819bebc34e5815bd193b9527bee5d04a306ea11e831","tests/tests.rs":"e4cfed20db4b5751fb1042c0e599d2a31647895fbfbbc10c38a4ef5eb03ca31c"},"package":"f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/scroll_derive/Cargo.lock
@@ -0,0 +1,47 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "proc-macro2"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.10.1"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[metadata]
+"checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
--- a/third_party/rust/scroll_derive/Cargo.toml
+++ b/third_party/rust/scroll_derive/Cargo.toml
@@ -1,35 +1,34 @@
 # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
 #
 # When uploading crates to the registry Cargo will automatically
 # "normalize" Cargo.toml files for maximal compatibility
 # with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
+# to registry (e.g., crates.io) dependencies
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
+edition = "2018"
 name = "scroll_derive"
-version = "0.9.5"
+version = "0.10.1"
 authors = ["m4b <m4b.github.io@gmail.com>", "Ted Mielczarek <ted@mielczarek.org>"]
 description = "A macros 1.1 derive implementation for Pread and Pwrite traits from the scroll crate"
 documentation = "https://docs.rs/scroll_derive"
 readme = "README.md"
 keywords = ["derive", "macros", "pread", "pwrite", "bytes"]
 license = "MIT"
-repository = "https://github.com/m4b/scroll_derive"
+repository = "https://github.com/m4b/scroll"
 
 [lib]
 proc-macro = true
 [dependencies.proc-macro2]
-version = "0.4"
+version = "1"
 
 [dependencies.quote]
-version = "0.6"
+version = "1"
 
 [dependencies.syn]
-version = "0.15"
-[dev-dependencies.scroll]
-version = "0.9"
+version = "1"
--- a/third_party/rust/scroll_derive/examples/main.rs
+++ b/third_party/rust/scroll_derive/examples/main.rs
@@ -1,11 +1,9 @@
-extern crate scroll;
-#[macro_use]
-extern crate scroll_derive;
+use scroll_derive::{Pread, Pwrite, IOread, IOwrite, SizeWith};
 
 #[derive(Debug, PartialEq, Pread, Pwrite, IOread, IOwrite, SizeWith)]
 #[repr(C)]
 struct Data {
     id: u32,
     timestamp: f64,
     arr: [u16; 2],
 }
--- a/third_party/rust/scroll_derive/src/lib.rs
+++ b/third_party/rust/scroll_derive/src/lib.rs
@@ -1,48 +1,45 @@
 #![recursion_limit="1024"]
 
 extern crate proc_macro;
-extern crate proc_macro2;
-#[macro_use]
-extern crate quote;
-extern crate syn;
+use proc_macro2;
+use quote::quote;
 
 use proc_macro::TokenStream;
 
 fn impl_struct(name: &syn::Ident, fields: &syn::FieldsNamed) -> proc_macro2::TokenStream {
     let items: Vec<_> = fields.named.iter().map(|f| {
         let ident = &f.ident;
         let ty = &f.ty;
-        match ty {
-            &syn::Type::Array(ref array) => {
+        match *ty {
+            syn::Type::Array(ref array) => {
                 match array.len {
                     syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(ref int), ..}) => {
-                        let size = int.value();
+                        let size = int.base10_parse::<usize>().unwrap();
                         quote! {
-                            #ident: { let mut __tmp: #ty = [0; #size as usize]; src.gread_inout_with(offset, &mut __tmp, ctx)?; __tmp }
+                            #ident: { let mut __tmp: #ty = [0; #size]; src.gread_inout_with(offset, &mut __tmp, ctx)?; __tmp }
                         }
                     },
                     _ => panic!("Pread derive with bad array constexpr")
                 }
             },
             _ => {
                 quote! {
                     #ident: src.gread_with::<#ty>(offset, ctx)?
                 }
             }
         }
     }).collect();
-    
+
     quote! {
         impl<'a> ::scroll::ctx::TryFromCtx<'a, ::scroll::Endian> for #name where #name: 'a {
             type Error = ::scroll::Error;
-            type Size = usize;
             #[inline]
-            fn try_from_ctx(src: &'a [u8], ctx: ::scroll::Endian) -> ::scroll::export::result::Result<(Self, Self::Size), Self::Error> {
+            fn try_from_ctx(src: &'a [u8], ctx: ::scroll::Endian) -> ::scroll::export::result::Result<(Self, usize), Self::Error> {
                 use ::scroll::Pread;
                 let offset = &mut 0;
                 let data  = #name { #(#items,)* };
                 Ok((data, *offset))
             }
         }
     }
 }
@@ -70,50 +67,48 @@ pub fn derive_pread(input: TokenStream) 
     let gen = impl_try_from_ctx(&ast);
     gen.into()
 }
 
 fn impl_try_into_ctx(name: &syn::Ident, fields: &syn::FieldsNamed) -> proc_macro2::TokenStream {
     let items: Vec<_> = fields.named.iter().map(|f| {
         let ident = &f.ident;
         let ty = &f.ty;
-        match ty {
-            &syn::Type::Array(_) => {
+        match *ty {
+            syn::Type::Array(_) => {
                 quote! {
                     for i in 0..self.#ident.len() {
                         dst.gwrite_with(&self.#ident[i], offset, ctx)?;
                     }
                 }
             },
             _ => {
                 quote! {
                     dst.gwrite_with(&self.#ident, offset, ctx)?
                 }
             }
         }
     }).collect();
-    
+
     quote! {
         impl<'a> ::scroll::ctx::TryIntoCtx<::scroll::Endian> for &'a #name {
             type Error = ::scroll::Error;
-            type Size = usize;
             #[inline]
-            fn try_into_ctx(self, dst: &mut [u8], ctx: ::scroll::Endian) -> ::scroll::export::result::Result<Self::Size, Self::Error> {
+            fn try_into_ctx(self, dst: &mut [u8], ctx: ::scroll::Endian) -> ::scroll::export::result::Result<usize, Self::Error> {
                 use ::scroll::Pwrite;
                 let offset = &mut 0;
                 #(#items;)*;
                 Ok(*offset)
             }
         }
 
         impl ::scroll::ctx::TryIntoCtx<::scroll::Endian> for #name {
             type Error = ::scroll::Error;
-            type Size = usize;
             #[inline]
-            fn try_into_ctx(self, dst: &mut [u8], ctx: ::scroll::Endian) -> ::scroll::export::result::Result<Self::Size, Self::Error> {
+            fn try_into_ctx(self, dst: &mut [u8], ctx: ::scroll::Endian) -> ::scroll::export::result::Result<usize, Self::Error> {
                 (&self).try_into_ctx(dst, ctx)
             }
         }
     }
 }
 
 fn impl_pwrite(ast: &syn::DeriveInput) -> proc_macro2::TokenStream {
     let name = &ast.ident;
@@ -137,41 +132,40 @@ pub fn derive_pwrite(input: TokenStream)
     let ast: syn::DeriveInput = syn::parse(input).unwrap();
     let gen = impl_pwrite(&ast);
     gen.into()
 }
 
 fn size_with(name: &syn::Ident, fields: &syn::FieldsNamed) -> proc_macro2::TokenStream {
     let items: Vec<_> = fields.named.iter().map(|f| {
         let ty = &f.ty;
-        match ty {
-            &syn::Type::Array(ref array) => {
+        match *ty {
+            syn::Type::Array(ref array) => {
                 let elem = &array.elem;
                 match array.len {
                     syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(ref int), ..}) => {
-                        let size = int.value() as usize;
+                        let size = int.base10_parse::<usize>().unwrap();
                         quote! {
                             (#size * <#elem>::size_with(ctx))
                         }
                     },
                     _ => panic!("Pread derive with bad array constexpr")
                 }
             },
             _ => {
                 quote! {
                     <#ty>::size_with(ctx)
                 }
             }
         }
     }).collect();
     quote! {
         impl ::scroll::ctx::SizeWith<::scroll::Endian> for #name {
-            type Units = usize;
             #[inline]
-            fn size_with(ctx: &::scroll::Endian) -> Self::Units {
+            fn size_with(ctx: &::scroll::Endian) -> usize {
                 0 #(+ #items)*
             }
         }
     }
 }
 
 fn impl_size_with(ast: &syn::DeriveInput) -> proc_macro2::TokenStream {
     let name = &ast.ident;
@@ -196,26 +190,26 @@ pub fn derive_sizewith(input: TokenStrea
     let gen = impl_size_with(&ast);
     gen.into()
 }
 
 fn impl_cread_struct(name: &syn::Ident, fields: &syn::FieldsNamed) -> proc_macro2::TokenStream {
     let items: Vec<_> = fields.named.iter().map(|f| {
         let ident = &f.ident;
         let ty = &f.ty;
-        match ty {
-            &syn::Type::Array(ref array) => {
+        match *ty {
+            syn::Type::Array(ref array) => {
                 let arrty = &array.elem;
                 match array.len {
                     syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(ref int), ..}) => {
-                        let size = int.value();
+                        let size = int.base10_parse::<usize>().unwrap();
                         let incr = quote! { ::scroll::export::mem::size_of::<#arrty>() };
                         quote! {
                             #ident: {
-                                let mut __tmp: #ty = [0; #size as usize];
+                                let mut __tmp: #ty = [0; #size];
                                 for i in 0..__tmp.len() {
                                     __tmp[i] = src.cread_with(*offset, ctx);
                                     *offset += #incr;
                                 }
                                 __tmp
                             }
                         }
                     },
@@ -268,18 +262,18 @@ pub fn derive_ioread(input: TokenStream)
     gen.into()
 }
 
 fn impl_into_ctx(name: &syn::Ident, fields: &syn::FieldsNamed) -> proc_macro2::TokenStream {
     let items: Vec<_> = fields.named.iter().map(|f| {
         let ident = &f.ident;
         let ty = &f.ty;
         let size = quote! { ::scroll::export::mem::size_of::<#ty>() };
-        match ty {
-            &syn::Type::Array(ref array) => {
+        match *ty {
+            syn::Type::Array(ref array) => {
                 let arrty = &array.elem;
                 quote! {
                     let size = ::scroll::export::mem::size_of::<#arrty>();
                     for i in 0..self.#ident.len() {
                         dst.cwrite_with(self.#ident[i], *offset, ctx);
                         *offset += size;
                     }
                 }
--- a/third_party/rust/scroll_derive/tests/tests.rs
+++ b/third_party/rust/scroll_derive/tests/tests.rs
@@ -1,20 +1,19 @@
-extern crate scroll;
-#[macro_use]
-extern crate scroll_derive;
+use scroll_derive::{Pread, Pwrite, SizeWith, IOread, IOwrite};
+use scroll::{Pread, Pwrite, Cread, Cwrite, LE};
+
+use scroll::ctx::SizeWith;
 
 #[derive(Debug, PartialEq, Pread, Pwrite)]
 struct Data {
   id: u32,
   timestamp: f64,
 }
 
-use scroll::{Pread, Pwrite, Cread, Cwrite, LE};
-use scroll::ctx::SizeWith;
 
 #[test]
 fn test_data (){
     let bytes = [0xefu8, 0xbe, 0xad, 0xde, 0, 0, 0, 0, 0, 0, 224, 63];
     let data: Data = bytes.pread_with(0, LE).unwrap();
     println!("data: {:?}", &data);
     assert_eq!(data.id, 0xdeadbeefu32);
     assert_eq!(data.timestamp, 0.5f64);
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.lock":"75d1f84b3d9e98d87e2f74984f7d032f5b28d7610cccf5e13977367189a77acd","Cargo.toml":"fe18dc2e0c86e6b28ed0244ced50e26f481087c693cb7cc1ff3062929894b0d4","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","README.md":"c3467056d91be3f59562158ee9604c729b5b5f473efbefb036032803eb76809e","build.rs":"a9f00c32de64b949c3bb23442304fc7943154efcc831aa0d87c9b83247e4e28a","examples/host.rs":"503bafddfb372123fe4dc0e7b8037808beb5bfe6df60c00d3315922bd3792c6c","examples/misc.rs":"49a579845450b7b020ed5c97dca142fc548725893cbc82f6f750ee0caab2beca","host.rs":"4ef91a2c26405151454c2695dc0a7f455374207900ea6814d4eafdfef5f7b630","newlist":"89564342916321c5bc35e772d374a7f0af22cc9ae6dcc0027eca48d2269f18cb","sorted.txt":"5548c14054ea61b51e2d8a495da662546523c3c13e8f742f6dd57754e11f46b5","src/host.rs":"fb543df4f362e9119a58523563e453110f4e3a426f0995911d0ca386657cf1d9","src/lib.rs":"5ad3a9418a6cb52cacc0a662645ccc671c326df954671b5ec0db667653dd125a","src/parse_error.rs":"f6689a741589ca8e659b1639728696f987c9da4948701f3b7ab6dc3e35754dab","src/targets.rs":"81320bd0280c96846a328689afe22be283cb7df9c37f005ff693ee1834b345a8","src/triple.rs":"ae2895bb2ee8451b90aa6e92d7fbf24c021230416fef030fb6ad0ef051c786c3","test.sh":"40761ee2ab0b361bdce4dc17708e671f32661f62cb56a45724d60510f9498b74"},"package":"7975cb2c6f37d77b190bc5004a2bb015971464756fde9514651a525ada2a741a"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/Cargo.lock
+++ /dev/null
@@ -1,109 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-[[package]]
-name = "failure"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "failure_derive"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
- "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "itoa"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "proc-macro2"
-version = "0.4.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "quote"
-version = "0.6.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde"
-version = "1.0.99"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
-name = "serde_json"
-version = "1.0.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "syn"
-version = "0.15.44"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "synstructure"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "target-lexicon"
-version = "0.8.1"
-dependencies = [
- "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "unicode-xid"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[metadata]
-"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
-"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
-"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
-"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
-"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
-"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
-"checksum serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)" = "fec2851eb56d010dc9a21b89ca53ee75e6528bab60c11e89d38390904982da9f"
-"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
-"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
-"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f"
-"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/Cargo.toml
+++ /dev/null
@@ -1,39 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-edition = "2018"
-name = "target-lexicon"
-version = "0.8.1"
-authors = ["Dan Gohman <sunfish@mozilla.com>"]
-description = "Targeting utilities for compilers and related tools"
-documentation = "https://docs.rs/target-lexicon/"
-readme = "README.md"
-keywords = ["target", "host", "triple", "compiler", "jit"]
-categories = ["no-std"]
-license = "Apache-2.0 WITH LLVM-exception"
-repository = "https://github.com/CraneStation/target-lexicon"
-[dependencies.failure]
-version = "0.1.3"
-features = ["derive"]
-default-features = false
-
-[dependencies.failure_derive]
-version = "0.1.3"
-default-features = false
-[build-dependencies.serde_json]
-version = "1.0"
-[badges.maintenance]
-status = "passively-maintained"
-
-[badges.travis-ci]
-repository = "CraneStation/target-lexicon"
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/LICENSE
+++ /dev/null
@@ -1,220 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
---- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-This is a library for managing targets for compilers and related tools.
-
-Currently, the main feature is support for decoding "triples", which
-are strings that identify a particular target configuration. They're named
-"triples" because historically they contained three fields, though over time
-they've added additional fields. This library provides a `Triple` struct
-containing enums for each of fields of a triple. `Triple` implements
-`FromStr` and `fmt::Display` so it can be converted to and from the
-conventional string representation of a triple.
-
-`Triple` also has functions for querying a triple's endianness,
-pointer bit width, and binary format.
-
-And, `Triple` and the enum types have `host()` constructors, for targeting
-the host.
-
-It supports all triples currently used by rustc and rustup.
-
-It does not support reading JSON target files itself. To use it with a JSON
-target file, construct a `Triple` using the value of the "llvm-target" field.
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/build.rs
+++ /dev/null
@@ -1,239 +0,0 @@
-//! build.rs file to obtain the host information.
-
-// Allow dead code in triple.rs and targets.rs for our purposes here.
-#![allow(dead_code)]
-
-use serde_json::Value;
-use std::env;
-use std::ffi::OsString;
-use std::fs::File;
-use std::io::prelude::*;
-use std::io::{self, Write};
-use std::path::{Path, PathBuf};
-use std::str::FromStr;
-
-extern crate alloc;
-extern crate serde_json;
-
-// Include triple.rs and targets.rs so we can parse the TARGET environment variable.
-mod triple {
-    include!("src/triple.rs");
-}
-mod targets {
-    include!("src/targets.rs");
-}
-
-// Stub out `ParseError` to minimally support triple.rs and targets.rs.
-mod parse_error {
-    #[derive(Debug)]
-    pub enum ParseError {
-        UnrecognizedArchitecture(String),
-        UnrecognizedVendor(String),
-        UnrecognizedOperatingSystem(String),
-        UnrecognizedEnvironment(String),
-        UnrecognizedBinaryFormat(String),
-        UnrecognizedField(String),
-        NoneWithoutBinaryFormat,
-    }
-}
-
-use self::triple::{Endianness, PointerWidth, Triple};
-
-/// Assuming `target` is a path to a custom target json config file, open it
-/// and build a `Triple` using its contents.
-fn read_target_from_file(path: &Path) -> Triple {
-    let mut file = File::open(path).expect("error opening target file");
-    let mut json = String::new();
-    file.read_to_string(&mut json)
-        .expect("error reading target file");
-
-    let v: Value = serde_json::from_str(&json).expect("error parsing target file as json");
-    let target = v["llvm-target"]
-        .as_str()
-        .expect("error parsing \"llvm-target\" as a string");
-    let triple = Triple::from_str(target).expect("error parsing host target");
-
-    // Check that the JSON describes a known target configuration.
-    //
-    // Unfortunately, none of Rust's "arch", "os", "env", nor "vendor"
-    // fields directly correspond to triple fields, so we can't easily
-    // check them.
-    if let Some(endian) = v["target-endian"].as_str() {
-        assert_eq!(
-            endian,
-            match triple.endianness().unwrap() {
-                Endianness::Little => "little",
-                Endianness::Big => "big",
-            },
-            "\"target-endian\" field disagrees with the target triple"
-        );
-    }
-    if let Some(pointer_width) = v["target-pointer-width"].as_str() {
-        assert_eq!(
-            pointer_width,
-            match triple.pointer_width().unwrap() {
-                PointerWidth::U16 => "16",
-                PointerWidth::U32 => "32",
-                PointerWidth::U64 => "64",
-            },
-            "\"target-pointer-width\" field disagrees with the target triple"
-        );
-    }
-
-    triple
-}
-
-/// Assuming `target` is a target identifier, search for an appropriate custom
-/// target json config file in the way that rustc does, and then call
-/// `read_target_from_file` on that.
-fn read_target_from_file_in_path(target: &str) -> Triple {
-    let mut target_filename = target.to_owned();
-    target_filename.push_str(".json");
-    let target_basename = PathBuf::from(target_filename);
-    let target_path = env::var_os("RUST_TARGET_PATH").unwrap_or_else(|| OsString::new());
-    for dir in env::split_paths(&target_path) {
-        let p = dir.join(&target_basename);
-        if p.is_file() {
-            return read_target_from_file(&p);
-        }
-    }
-    panic!("can't find custom target {}", target);
-}
-
-fn main() {
-    let out_dir =
-        PathBuf::from(env::var("OUT_DIR").expect("The OUT_DIR environment variable must be set"));
-
-    let target = env::var("TARGET").expect("The TARGET environment variable must be set");
-
-    // The following intends to match the logic in rustc.
-    let triple = if target.ends_with(".json") {
-        read_target_from_file(Path::new(&target))
-    } else {
-        match Triple::from_str(&target) {
-            Ok(triple) => triple,
-            Err(_) => read_target_from_file_in_path(&target),
-        }
-    };
-
-    let out = File::create(out_dir.join("host.rs")).expect("error creating host.rs");
-    write_host_rs(out, triple).expect("error writing host.rs");
-}
-
-fn write_host_rs(mut out: File, triple: Triple) -> io::Result<()> {
-    // The generated Debug implementation for the inner architecture variants
-    // doesn't print the enum name qualifier, so import them here. There
-    // shouldn't be any conflicts because these enums all share a namespace
-    // in the triple string format.
-    writeln!(out, "#[allow(unused_imports)]")?;
-    writeln!(out, "use crate::Aarch64Architecture::*;")?;
-    writeln!(out, "#[allow(unused_imports)]")?;
-    writeln!(out, "use crate::ArmArchitecture::*;")?;
-    writeln!(out)?;
-    writeln!(out, "/// The `Triple` of the current host.")?;
-    writeln!(out, "pub const HOST: Triple = Triple {{")?;
-    writeln!(
-        out,
-        "    architecture: Architecture::{:?},",
-        triple.architecture
-    )?;
-    writeln!(out, "    vendor: Vendor::{:?},", triple.vendor)?;
-    writeln!(
-        out,
-        "    operating_system: OperatingSystem::{:?},",
-        triple.operating_system
-    )?;
-    writeln!(
-        out,
-        "    environment: Environment::{:?},",
-        triple.environment
-    )?;
-    writeln!(
-        out,
-        "    binary_format: BinaryFormat::{:?},",
-        triple.binary_format
-    )?;
-    writeln!(out, "}};")?;
-    writeln!(out)?;
-
-    writeln!(out, "impl Architecture {{")?;
-    writeln!(out, "    /// Return the architecture for the current host.")?;
-    writeln!(out, "    pub const fn host() -> Self {{")?;
-    writeln!(out, "        Architecture::{:?}", triple.architecture)?;
-    writeln!(out, "    }}")?;
-    writeln!(out, "}}")?;
-    writeln!(out)?;
-
-    writeln!(out, "impl Vendor {{")?;
-    writeln!(out, "    /// Return the vendor for the current host.")?;
-    writeln!(out, "    pub const fn host() -> Self {{")?;
-    writeln!(out, "        Vendor::{:?}", triple.vendor)?;
-    writeln!(out, "    }}")?;
-    writeln!(out, "}}")?;
-    writeln!(out)?;
-
-    writeln!(out, "impl OperatingSystem {{")?;
-    writeln!(
-        out,
-        "    /// Return the operating system for the current host."
-    )?;
-    writeln!(out, "    pub const fn host() -> Self {{")?;
-    writeln!(
-        out,
-        "        OperatingSystem::{:?}",
-        triple.operating_system
-    )?;
-    writeln!(out, "    }}")?;
-    writeln!(out, "}}")?;
-    writeln!(out)?;
-
-    writeln!(out, "impl Environment {{")?;
-    writeln!(out, "    /// Return the environment for the current host.")?;
-    writeln!(out, "    pub const fn host() -> Self {{")?;
-    writeln!(out, "        Environment::{:?}", triple.environment)?;
-    writeln!(out, "    }}")?;
-    writeln!(out, "}}")?;
-    writeln!(out)?;
-
-    writeln!(out, "impl BinaryFormat {{")?;
-    writeln!(
-        out,
-        "    /// Return the binary format for the current host."
-    )?;
-    writeln!(out, "    pub const fn host() -> Self {{")?;
-    writeln!(out, "        BinaryFormat::{:?}", triple.binary_format)?;
-    writeln!(out, "    }}")?;
-    writeln!(out, "}}")?;
-    writeln!(out)?;
-
-    writeln!(out, "impl Triple {{")?;
-    writeln!(out, "    /// Return the triple for the current host.")?;
-    writeln!(out, "    pub const fn host() -> Self {{")?;
-    writeln!(out, "        Self {{")?;
-    writeln!(
-        out,
-        "            architecture: Architecture::{:?},",
-        triple.architecture
-    )?;
-    writeln!(out, "            vendor: Vendor::{:?},", triple.vendor)?;
-    writeln!(
-        out,
-        "            operating_system: OperatingSystem::{:?},",
-        triple.operating_system
-    )?;
-    writeln!(
-        out,
-        "            environment: Environment::{:?},",
-        triple.environment
-    )?;
-    writeln!(
-        out,
-        "            binary_format: BinaryFormat::{:?},",
-        triple.binary_format
-    )?;
-    writeln!(out, "        }}")?;
-    writeln!(out, "    }}")?;
-    writeln!(out, "}}")?;
-
-    Ok(())
-}
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/examples/host.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-extern crate target_lexicon;
-
-use target_lexicon::HOST;
-
-fn main() {
-    println!(
-        "{}",
-        HOST.pointer_width()
-            .expect("architecture should be known")
-            .bytes()
-    );
-}
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/examples/misc.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-extern crate target_lexicon;
-
-use core::str::FromStr;
-use target_lexicon::{Triple, HOST};
-
-fn main() {
-    println!("The host triple is {}.", HOST);
-
-    let e = Triple::from_str("riscv32-unknown-unknown")
-        .expect("expected to recognize the RISC-V target")
-        .endianness()
-        .expect("expected to know the endianness of RISC-V");
-    println!("The endianness of RISC-V is {:?}.", e);
-}
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/host.rs
+++ /dev/null
@@ -1,61 +0,0 @@
-#[allow(unused_imports)]
-use crate::Aarch64Architecture::*;
-#[allow(unused_imports)]
-use crate::ArmArchitecture::*;
-
-/// The `Triple` of the current host.
-pub const HOST: Triple = Triple {
-    architecture: Architecture::Aarch64(Aarch64),
-    vendor: Vendor::Unknown,
-    operating_system: OperatingSystem::Linux,
-    environment: Environment::Gnu,
-    binary_format: BinaryFormat::Elf,
-};
-
-impl Architecture {
-    /// Return the architecture for the current host.
-    pub const fn host() -> Self {
-        Architecture::Aarch64(Aarch64)
-    }
-}
-
-impl Vendor {
-    /// Return the vendor for the current host.
-    pub const fn host() -> Self {
-        Vendor::Unknown
-    }
-}
-
-impl OperatingSystem {
-    /// Return the operating system for the current host.
-    pub const fn host() -> Self {
-        OperatingSystem::Linux
-    }
-}
-
-impl Environment {
-    /// Return the environment for the current host.
-    pub const fn host() -> Self {
-        Environment::Gnu
-    }
-}
-
-impl BinaryFormat {
-    /// Return the binary format for the current host.
-    pub const fn host() -> Self {
-        BinaryFormat::Elf
-    }
-}
-
-impl Triple {
-    /// Return the triple for the current host.
-    pub const fn host() -> Self {
-        Self {
-            architecture: Architecture::Aarch64(Aarch64),
-            vendor: Vendor::Unknown,
-            operating_system: OperatingSystem::Linux,
-            environment: Environment::Gnu,
-            binary_format: BinaryFormat::Elf,
-        }
-    }
-}
deleted file mode 100755
--- a/third_party/rust/target-lexicon-0.8.1/newlist
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-set -euo pipefail
-
-rustup target list | sed 's/ (.*//' > list.txt
-rustc +nightly --print target-list >> list.txt
-cat list.txt | sort | uniq |sed 's/\(.*\)/            "\1",/' > sorted.txt
-rm list.txt
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/sorted.txt
+++ /dev/null
@@ -1,140 +0,0 @@
-            "aarch64-apple-ios",
-            "aarch64-fuchsia",
-            "aarch64-linux-android",
-            "aarch64-pc-windows-msvc",
-            "aarch64-unknown-cloudabi",
-            "aarch64-unknown-freebsd",
-            "aarch64-unknown-hermit",
-            "aarch64-unknown-linux-gnu",
-            "aarch64-unknown-linux-musl",
-            "aarch64-unknown-netbsd",
-            "aarch64-unknown-none",
-            "aarch64-unknown-openbsd",
-            "aarch64-unknown-redox",
-            "aarch64-uwp-windows-msvc",
-            "aarch64-wrs-vxworks",
-            "armebv7r-none-eabi",
-            "armebv7r-none-eabihf",
-            "arm-linux-androideabi",
-            "arm-unknown-linux-gnueabi",
-            "arm-unknown-linux-gnueabihf",
-            "arm-unknown-linux-musleabi",
-            "arm-unknown-linux-musleabihf",
-            "armv4t-unknown-linux-gnueabi",
-            "armv5te-unknown-linux-gnueabi",
-            "armv5te-unknown-linux-musleabi",
-            "armv6-unknown-freebsd",
-            "armv6-unknown-netbsd-eabihf",
-            "armv7-apple-ios",
-            "armv7-linux-androideabi",
-            "armv7r-none-eabi",
-            "armv7r-none-eabihf",
-            "armv7s-apple-ios",
-            "armv7-unknown-cloudabi-eabihf",
-            "armv7-unknown-freebsd",
-            "armv7-unknown-linux-gnueabi",
-            "armv7-unknown-linux-gnueabihf",
-            "armv7-unknown-linux-musleabi",
-            "armv7-unknown-linux-musleabihf",
-            "armv7-unknown-netbsd-eabihf",
-            "armv7-wrs-vxworks-eabihf",
-            "asmjs-unknown-emscripten",
-            "hexagon-unknown-linux-musl",
-            "i386-apple-ios",
-            "i586-pc-windows-msvc",
-            "i586-unknown-linux-gnu",
-            "i586-unknown-linux-musl",
-            "i686-apple-darwin",
-            "i686-linux-android",
-            "i686-pc-windows-gnu",
-            "i686-pc-windows-msvc",
-            "i686-unknown-cloudabi",
-            "i686-unknown-dragonfly",
-            "i686-unknown-freebsd",
-            "i686-unknown-haiku",
-            "i686-unknown-linux-gnu",
-            "i686-unknown-linux-musl",
-            "i686-unknown-netbsd",
-            "i686-unknown-openbsd",
-            "i686-uwp-windows-gnu",
-            "i686-uwp-windows-msvc",
-            "i686-wrs-vxworks",
-            "mips64el-unknown-linux-gnuabi64",
-            "mips64el-unknown-linux-muslabi64",
-            "mips64-unknown-linux-gnuabi64",
-            "mips64-unknown-linux-muslabi64",
-            "mipsel-unknown-linux-gnu",
-            "mipsel-unknown-linux-musl",
-            "mipsel-unknown-linux-uclibc",
-            "mipsisa32r6el-unknown-linux-gnu",
-            "mipsisa32r6-unknown-linux-gnu",
-            "mipsisa64r6el-unknown-linux-gnuabi64",
-            "mipsisa64r6-unknown-linux-gnuabi64",
-            "mips-unknown-linux-gnu",
-            "mips-unknown-linux-musl",
-            "mips-unknown-linux-uclibc",
-            "msp430-none-elf",
-            "nvptx64-nvidia-cuda",
-            "powerpc64le-unknown-linux-gnu",
-            "powerpc64le-unknown-linux-musl",
-            "powerpc64-unknown-freebsd",
-            "powerpc64-unknown-linux-gnu",
-            "powerpc64-unknown-linux-musl",
-            "powerpc64-wrs-vxworks",
-            "powerpc-unknown-linux-gnu",
-            "powerpc-unknown-linux-gnuspe",
-            "powerpc-unknown-linux-musl",
-            "powerpc-unknown-netbsd",
-            "powerpc-wrs-vxworks",
-            "powerpc-wrs-vxworks-spe",
-            "riscv32imac-unknown-none-elf",
-            "riscv32imc-unknown-none-elf",
-            "riscv32i-unknown-none-elf",
-            "riscv64gc-unknown-none-elf",
-            "riscv64imac-unknown-none-elf",
-            "s390x-unknown-linux-gnu",
-            "sparc64-unknown-linux-gnu",
-            "sparc64-unknown-netbsd",
-            "sparc64-unknown-openbsd",
-            "sparc-unknown-linux-gnu",
-            "sparcv9-sun-solaris",
-            "thumbv6m-none-eabi",
-            "thumbv7a-pc-windows-msvc",
-            "thumbv7em-none-eabi",
-            "thumbv7em-none-eabihf",
-            "thumbv7m-none-eabi",
-            "thumbv7neon-linux-androideabi",
-            "thumbv7neon-unknown-linux-gnueabihf",
-            "thumbv8m.base-none-eabi",
-            "thumbv8m.main-none-eabi",
-            "thumbv8m.main-none-eabihf",
-            "wasm32-experimental-emscripten",
-            "wasm32-unknown-emscripten",
-            "wasm32-unknown-unknown",
-            "wasm32-wasi",
-            "x86_64-apple-darwin",
-            "x86_64-apple-ios",
-            "x86_64-fortanix-unknown-sgx",
-            "x86_64-fuchsia",
-            "x86_64-linux-android",
-            "x86_64-pc-solaris",
-            "x86_64-pc-windows-gnu",
-            "x86_64-pc-windows-msvc",
-            "x86_64-rumprun-netbsd",
-            "x86_64-sun-solaris",
-            "x86_64-unknown-cloudabi",
-            "x86_64-unknown-dragonfly",
-            "x86_64-unknown-freebsd",
-            "x86_64-unknown-haiku",
-            "x86_64-unknown-hermit",
-            "x86_64-unknown-l4re-uclibc",
-            "x86_64-unknown-linux-gnu",
-            "x86_64-unknown-linux-gnux32",
-            "x86_64-unknown-linux-musl",
-            "x86_64-unknown-netbsd",
-            "x86_64-unknown-openbsd",
-            "x86_64-unknown-redox",
-            "x86_64-unknown-uefi",
-            "x86_64-uwp-windows-gnu",
-            "x86_64-uwp-windows-msvc",
-            "x86_64-wrs-vxworks",
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/src/host.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-use crate::{Architecture, BinaryFormat, Environment, OperatingSystem, Triple, Vendor};
-
-// Include the implementations of the `HOST` object containing information
-// about the current host.
-include!(concat!(env!("OUT_DIR"), "/host.rs"));
-
-#[cfg(test)]
-mod tests {
-    #[cfg(target_os = "linux")]
-    #[test]
-    fn test_linux() {
-        use super::*;
-        assert_eq!(OperatingSystem::host(), OperatingSystem::Linux);
-    }
-
-    #[cfg(target_os = "macos")]
-    #[test]
-    fn test_macos() {
-        use super::*;
-        assert_eq!(OperatingSystem::host(), OperatingSystem::Darwin);
-    }
-
-    #[cfg(windows)]
-    #[test]
-    fn test_windows() {
-        use super::*;
-        assert_eq!(OperatingSystem::host(), OperatingSystem::Windows);
-    }
-
-    #[cfg(target_pointer_width = "16")]
-    #[test]
-    fn test_ptr16() {
-        use super::*;
-        assert_eq!(Architecture::host().pointer_width().unwrap().bits(), 16);
-    }
-
-    #[cfg(target_pointer_width = "32")]
-    #[test]
-    fn test_ptr32() {
-        use super::*;
-        assert_eq!(Architecture::host().pointer_width().unwrap().bits(), 32);
-    }
-
-    #[cfg(target_pointer_width = "64")]
-    #[test]
-    fn test_ptr64() {
-        use super::*;
-        assert_eq!(Architecture::host().pointer_width().unwrap().bits(), 64);
-    }
-
-    #[test]
-    fn host_object() {
-        use super::*;
-        assert_eq!(HOST, Triple::host());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/src/lib.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-//! Target triple support.
-
-#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)]
-#![warn(unused_import_braces)]
-#![cfg_attr(
-    feature = "cargo-clippy",
-    warn(
-        clippy::float_arithmetic,
-        clippy::mut_mut,
-        clippy::nonminimal_bool,
-        clippy::option_map_unwrap_or,
-        clippy::option_map_unwrap_or_else,
-        clippy::print_stdout,
-        clippy::unicode_not_nfc,
-        clippy::use_self
-    )
-)]
-#![no_std]
-
-extern crate alloc;
-
-#[macro_use]
-extern crate failure_derive;
-
-mod host;
-mod parse_error;
-mod targets;
-#[macro_use]
-mod triple;
-
-pub use self::host::HOST;
-pub use self::parse_error::ParseError;
-pub use self::targets::{
-    Aarch64Architecture, Architecture, ArmArchitecture, BinaryFormat, Environment, OperatingSystem,
-    Vendor,
-};
-pub use self::triple::{CallingConvention, Endianness, PointerWidth, Triple};
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/src/parse_error.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use alloc::string::String;
-
-/// An error returned from parsing a triple.
-#[derive(Fail, Clone, Debug, PartialEq, Eq)]
-#[allow(missing_docs)]
-pub enum ParseError {
-    #[fail(display = "Unrecognized architecture: {}", _0)]
-    UnrecognizedArchitecture(String),
-    #[fail(display = "Unrecognized vendor: {}", _0)]
-    UnrecognizedVendor(String),
-    #[fail(display = "Unrecognized operating system: {}", _0)]
-    UnrecognizedOperatingSystem(String),
-    #[fail(display = "Unrecognized environment: {}", _0)]
-    UnrecognizedEnvironment(String),
-    #[fail(display = "Unrecognized binary format: {}", _0)]
-    UnrecognizedBinaryFormat(String),
-    #[fail(display = "Unrecognized field: {}", _0)]
-    UnrecognizedField(String),
-}
deleted file mode 100644
--- a/third_party/rust/target-lexicon-0.8.1/src/targets.rs
+++ /dev/null
@@ -1,1114 +0,0 @@
-// This file defines all the identifier enums and target-aware logic.
-
-use crate::triple::{Endianness, PointerWidth, Triple};
-use core::fmt;
-use core::str::FromStr;
-
-/// The "architecture" field, which in some cases also specifies a specific
-/// subarchitecture.
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
-#[allow(missing_docs)]
-pub enum Architecture {
-    Unknown,
-    Arm(ArmArchitecture),
-    AmdGcn,
-    Aarch64(Aarch64Architecture),
-    Asmjs,
-    Hexagon,
-    I386,
-    I586,
-    I686,
-    Mips,
-    Mips64,
-    Mips64el,
-    Mipsel,
-    Mipsisa32r6,
-    Mipsisa32r6el,
-    Mipsisa64r6,
-    Mipsisa64r6el,
-    Msp430,
-    Nvptx64,
-    Powerpc,
-    Powerpc64,
-    Powerpc64le,
-    Riscv32,
-    Riscv32i,
-    Riscv32imac,
-    Riscv32imc,
-    Riscv64,
-    Riscv64gc,
-    Riscv64imac,
-    S390x,
-    Sparc,
-    Sparc64,
-    Sparcv9,
-    Wasm32,
-    X86_64,
-}
-
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
-#[allow(missing_docs)]
-pub enum ArmArchitecture {
-    Arm, // Generic arm
-    Armeb,
-    Armv4,
-    Armv4t,
-    Armv5t,
-    Armv5te,
-    Armv5tej,
-    Armv6,
-    Armv6j,
-    Armv6k,
-    Armv6z,
-    Armv6kz,
-    Armv6t2,
-    Armv6m,
-    Armv7,
-    Armv7a,
-    Armv7ve,
-    Armv7m,
-    Armv7r,
-    Armv7s,
-    Armv8,
-    Armv8a,
-    Armv8_1a,
-    Armv8_2a,
-    Armv8_3a,
-    Armv8_4a,
-    Armv8_5a,
-    Armv8mBase,
-    Armv8mMain,
-    Armv8r,
-
-    Armebv7r,
-
-    Thumbeb,
-    Thumbv6m,
-    Thumbv7a,
-    Thumbv7em,
-    Thumbv7m,
-    Thumbv7neon,
-    Thumbv8mBase,
-    Thumbv8mMain,
-}
-
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
-#[allow(missing_docs)]
-pub enum Aarch64Architecture {
-    Aarch64,
-    Aarch64be,
-}
-
-// #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
-// #[allow(missing_docs)]
-// pub enum ArmFpu {
-//     Vfp,
-//     Vfpv2,
-//     Vfpv3,
-//     Vfpv3Fp16,
-//     Vfpv3Xd,
-//     Vfpv3XdFp16,
-//     Neon,
-//     NeonVfpv3,
-//     NeonVfpv4,
-//     Vfpv4,
-//     Vfpv4D16,
-//     Fpv4SpD16,
-//     Fpv5SpD16,
-//     Fpv5D16,
-//     FpArmv8,
-//     NeonFpArmv8,
-//     CryptoNeonFpArmv8,
-// }
-
-impl ArmArchitecture {
-    /// Test if this architecture uses the Thumb instruction set.
-    pub fn is_thumb(self) -> bool {
-        match self {
-            ArmArchitecture::Arm
-            | ArmArchitecture::Armeb
-            | ArmArchitecture::Armv4
-            | ArmArchitecture::Armv4t
-            | ArmArchitecture::Armv5t
-            | ArmArchitecture::Armv5te
-            | ArmArchitecture::Armv5tej
-            | ArmArchitecture::Armv6
-            | ArmArchitecture::Armv6j
-            | ArmArchitecture::Armv6k
-            | ArmArchitecture::Armv6z
-            | ArmArchitecture::Armv6kz
-            | ArmArchitecture::Armv6t2
-            | ArmArchitecture::Armv6m
-            | ArmArchitecture::Armv7
-            | ArmArchitecture::Armv7a
-            | ArmArchitecture::Armv7ve
-            | ArmArchitecture::Armv7m
-            | ArmArchitecture::Armv7r
-            | ArmArchitecture::Armv7s
-            | ArmArchitecture::Armv8
-            | ArmArchitecture::Armv8a
-            | ArmArchitecture::Armv8_1a
-            | ArmArchitecture::Armv8_2a