Repository: cross-rs/cross
Pull request #1544 (2024-08-17 09:23:20)

fix warning on `default_features`


Patch:
diff --git a/.changes/1038-1220-1482.json b/.changes/1038-1220-1482.json
deleted file mode 100644
index 0a59298..0000000
--- a/.changes/1038-1220-1482.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[
-    {
-        "description": "bump MSRV to 1.77.2",
-        "type": "internal"
-    }
-]
diff --git a/.changes/1038-1220.json b/.changes/1038-1220.json
new file mode 100644
index 0000000..e7f603d
--- /dev/null
+++ b/.changes/1038-1220.json
@@ -0,0 +1,6 @@
+[
+    {
+        "description": "bump MSRV to 1.64",
+        "type": "internal"
+    }
+]
diff --git a/.changes/1374-1490.json b/.changes/1374.json
similarity index 51%
rename from .changes/1374-1490.json
rename to .changes/1374.json
index bfab110..ca1d879 100644
--- a/.changes/1374-1490.json
+++ b/.changes/1374.json
@@ -1,5 +1,5 @@
 {
     "type": "changed",
-    "description": "update wine to 9.0.0.0",
+    "description": "update wine to 8.0.2",
     "issues": [1372]
 }
diff --git a/.changes/1458.json b/.changes/1458.json
deleted file mode 100644
index 46b9481..0000000
--- a/.changes/1458.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "description": "add gfortran for target *-gnu*, *-musl*, *-freebsd*, *-solaris*, *-dragonfly*, *-illumos*, *-netbsd*",
-  "issues": [1457],
-  "type": "added"
-
-}
diff --git a/.changes/1481.json b/.changes/1481.json
deleted file mode 100644
index 96649d0..0000000
--- a/.changes/1481.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "description": "allow pass-through environment variables to contain numbers",
-    "type": "fixed"
-}
\ No newline at end of file
diff --git a/.changes/1483.json b/.changes/1483.json
deleted file mode 100644
index 8e55ce3..0000000
--- a/.changes/1483.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "description": "Fix paths when using `CROSS_CONTAINER_IN_CONTAINER`",
-    "type": "fixed"
-}
\ No newline at end of file
diff --git a/.changes/1485.json b/.changes/1485.json
deleted file mode 100644
index 3b00380..0000000
--- a/.changes/1485.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "description": "Use `/proc/self/mountinfo` as a fallback for `docker inspect` if using `HOSTNAME` fails",
-    "issues": [1321],
-    "type": "changed"
-}
diff --git a/.changes/1488.json b/.changes/1488.json
deleted file mode 100644
index 4853f51..0000000
--- a/.changes/1488.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "description": "Allow `build-std` to take an array of crate names",
-    "issues": [896],
-    "type": "changed",
-	"breaking": true
-}
diff --git a/.changes/1489.json b/.changes/1489.json
deleted file mode 100644
index a34bae9..0000000
--- a/.changes/1489.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "description": "Simplify config internals",
-    "type": "internal"
-}
diff --git a/.changes/1491.json b/.changes/1491.json
deleted file mode 100644
index b0cd7b9..0000000
--- a/.changes/1491.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "description": "Allow specifying only a tag or subtarget for images in config",
-    "issues": [1169],
-    "type": "changed"
-}
diff --git a/.changes/1494.json b/.changes/1494.json
deleted file mode 100644
index 6f24c70..0000000
--- a/.changes/1494.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "description": "Fix `zig.image` precedence",
-    "type": "fixed",
-    "breaking": true
-}
diff --git a/.changes/1495.json b/.changes/1495.json
deleted file mode 100644
index f5c10bb..0000000
--- a/.changes/1495.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "description": "Fix `*-solaris` targets",
-    "issues": [1424],
-    "type": "fixed",
-    "breaking": true
-}
diff --git a/.changes/1525.json b/.changes/1525.json
deleted file mode 100644
index c912f38..0000000
--- a/.changes/1525.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "description": "Fix riscv64gc-unknown-linux-gnu target",
-    "issues": [1423],
-    "type": "fixed"
-}
diff --git a/.changes/1540.json b/.changes/1540.json
deleted file mode 100644
index ae5b2f7..0000000
--- a/.changes/1540.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "description": "Upgrade the crosstool for the loongarch64-unknown-linux-gnu target",
-    "issues": [1538],
-    "type": "fixed"
-}
diff --git a/.github/ISSUE_TEMPLATE/b_issue_report.yml b/.github/ISSUE_TEMPLATE/b_issue_report.yml
index c73e3ad..0680131 100644
--- a/.github/ISSUE_TEMPLATE/b_issue_report.yml
+++ b/.github/ISSUE_TEMPLATE/b_issue_report.yml
@@ -75,7 +75,7 @@ body:
         - wasm32-unknown-emscripten
         - x86_64-linux-android
         - x86_64-pc-windows-gnu
-        - x86_64-pc-solaris
+        - x86_64-sun-solaris
         - x86_64-unknown-freebsd
         - x86_64-unknown-linux-gnu
         - x86_64-unknown-linux-musl
diff --git a/.github/actions/cargo-llvm-cov/action.yml b/.github/actions/cargo-llvm-cov/action.yml
index edf689c..fea7261 100644
--- a/.github/actions/cargo-llvm-cov/action.yml
+++ b/.github/actions/cargo-llvm-cov/action.yml
@@ -12,9 +12,9 @@ runs:
   using: composite
   steps:
     - name: Install cargo-llvm-cov
-      uses: taiki-e/install-action@v2
+      uses: taiki-e/install-action@v1
       with:
-        tool: cargo-llvm-cov@0.5.3
+        tool: cargo-llvm-cov
     - run: rustup component add llvm-tools-preview
       shell: bash
     - name: LLVM instrument coverage
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f754a67..9e61d24 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -71,7 +71,7 @@ jobs:
       - uses: ./.github/actions/setup-rust
         with:
           components: clippy
-          toolchain: 1.77.2 # MSRV, Minimally Supported Rust Version. Make sure to update README.md and clippy.toml
+          toolchain: 1.64.0 # MSRV, Minimally Supported Rust Version. Make sure to update README.md and clippy.toml
       - name: Run clippy
         run: cargo clippy --locked --all-targets --all-features --workspace -- -D warnings
   test:
diff --git a/Cargo.lock b/Cargo.lock
index 521da27..355edda 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "addr2line"
-version = "0.21.0"
+version = "0.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
 dependencies = [
  "gimli",
 ]
@@ -19,19 +19,13 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.3"
+version = "0.7.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
 dependencies = [
  "memchr",
 ]
 
-[[package]]
-name = "android-tzdata"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
-
 [[package]]
 name = "android_system_properties"
 version = "0.1.5"
@@ -41,54 +35,6 @@ dependencies = [
  "libc",
 ]
 
-[[package]]
-name = "anstream"
-version = "0.6.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
-
-[[package]]
-name = "anstyle-parse"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
-dependencies = [
- "windows-sys",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
-dependencies = [
- "anstyle",
- "windows-sys",
-]
-
 [[package]]
 name = "atty"
 version = "0.2.14"
@@ -102,15 +48,15 @@ dependencies = [
 
 [[package]]
 name = "autocfg"
-version = "1.2.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
 [[package]]
 name = "backtrace"
-version = "0.3.71"
+version = "0.3.67"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
 dependencies = [
  "addr2line",
  "cc",
@@ -127,17 +73,11 @@ version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
-[[package]]
-name = "bitflags"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
-
 [[package]]
 name = "bstr"
-version = "1.9.1"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
+checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
 dependencies = [
  "memchr",
  "serde",
@@ -145,15 +85,15 @@ dependencies = [
 
 [[package]]
 name = "bumpalo"
-version = "3.16.0"
+version = "3.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
 
 [[package]]
 name = "cc"
-version = "1.0.96"
+version = "1.0.79"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
 
 [[package]]
 name = "cfg-if"
@@ -163,45 +103,39 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
 name = "chrono"
-version = "0.4.38"
+version = "0.4.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
 dependencies = [
- "android-tzdata",
  "iana-time-zone",
  "js-sys",
+ "num-integer",
  "num-traits",
+ "time",
  "wasm-bindgen",
- "windows-targets",
+ "winapi",
 ]
 
 [[package]]
 name = "clap"
-version = "4.5.4"
+version = "4.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
+checksum = "3c911b090850d79fc64fe9ea01e28e465f65e821e08813ced95bced72f7a8a9b"
 dependencies = [
- "clap_builder",
+ "bitflags",
  "clap_derive",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
-dependencies = [
- "anstream",
- "anstyle",
  "clap_lex",
+ "is-terminal",
+ "once_cell",
  "strsim",
+ "termcolor",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.5.4"
+version = "4.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
+checksum = "9a932373bab67b984c790ddf2c9ca295d8e3af3b7ef92de5a5bacdccdee4b09b"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -211,15 +145,28 @@ dependencies = [
 
 [[package]]
 name = "clap_lex"
-version = "0.7.0"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
 
 [[package]]
 name = "color-eyre"
-version = "0.6.3"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5"
+checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204"
 dependencies = [
  "backtrace",
  "color-spantrace",
@@ -232,9 +179,9 @@ dependencies = [
 
 [[package]]
 name = "color-spantrace"
-version = "0.2.1"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2"
+checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce"
 dependencies = [
  "once_cell",
  "owo-colors",
@@ -242,12 +189,6 @@ dependencies = [
  "tracing-error",
 ]
 
-[[package]]
-name = "colorchoice"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
-
 [[package]]
 name = "const-sha1"
 version = "0.2.0"
@@ -256,9 +197,9 @@ checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d"
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.6"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
 
 [[package]]
 name = "cross"
@@ -296,29 +237,48 @@ dependencies = [
 ]
 
 [[package]]
-name = "crossbeam-deque"
-version = "0.8.5"
+name = "cxx"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+checksum = "a9c00419335c41018365ddf7e4d5f1c12ee3659ddcf3e01974650ba1de73d038"
 dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
+ "cc",
+ "cxxbridge-flags",
+ "cxxbridge-macro",
+ "link-cplusplus",
 ]
 
 [[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
+name = "cxx-build"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+checksum = "fb8307ad413a98fff033c8545ecf133e3257747b3bae935e7602aab8aa92d4ca"
 dependencies = [
- "crossbeam-utils",
+ "cc",
+ "codespan-reporting",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "scratch",
+ "syn",
 ]
 
 [[package]]
-name = "crossbeam-utils"
-version = "0.8.19"
+name = "cxxbridge-flags"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "edc52e2eb08915cb12596d29d55f0b5384f00d697a646dbd269b6ecb0fbd9d31"
+
+[[package]]
+name = "cxxbridge-macro"
+version = "1.0.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "631569015d0d8d54e6c241733f944042623ab6df7bc3be7466874b05fcdb1c5f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
 
 [[package]]
 name = "directories"
@@ -342,37 +302,31 @@ dependencies = [
 
 [[package]]
 name = "dunce"
-version = "1.0.4"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c"
 
 [[package]]
 name = "either"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
+version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
 
 [[package]]
 name = "errno"
-version = "0.3.8"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
 dependencies = [
  "libc",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "eyre"
-version = "0.6.12"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
+checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb"
 dependencies = [
  "indenter",
  "once_cell",
@@ -380,51 +334,60 @@ dependencies = [
 
 [[package]]
 name = "fastrand"
-version = "2.1.0"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "getrandom"
-version = "0.2.14"
+version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
 dependencies = [
  "cfg-if",
  "libc",
- "wasi",
+ "wasi 0.11.0+wasi-snapshot-preview1",
 ]
 
 [[package]]
 name = "gimli"
-version = "0.28.1"
+version = "0.27.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
 
 [[package]]
 name = "globset"
-version = "0.4.14"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
 dependencies = [
  "aho-corasick",
  "bstr",
+ "fnv",
  "log",
- "regex-automata",
- "regex-syntax",
+ "regex",
 ]
 
 [[package]]
 name = "hashbrown"
-version = "0.14.5"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 
 [[package]]
 name = "heck"
-version = "0.5.0"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
 
 [[package]]
 name = "hermit-abi"
@@ -437,54 +400,56 @@ dependencies = [
 
 [[package]]
 name = "hermit-abi"
-version = "0.3.9"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
 
 [[package]]
 name = "home"
-version = "0.5.9"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
+checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408"
 dependencies = [
- "windows-sys",
+ "winapi",
 ]
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.60"
+version = "0.1.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
  "iana-time-zone-haiku",
  "js-sys",
  "wasm-bindgen",
- "windows-core",
+ "windows",
 ]
 
 [[package]]
 name = "iana-time-zone-haiku"
-version = "0.1.2"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
 dependencies = [
- "cc",
+ "cxx",
+ "cxx-build",
 ]
 
 [[package]]
 name = "ignore"
-version = "0.4.22"
+version = "0.4.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
 dependencies = [
- "crossbeam-deque",
  "globset",
+ "lazy_static",
  "log",
  "memchr",
- "regex-automata",
+ "regex",
  "same-file",
+ "thread_local",
  "walkdir",
  "winapi-util",
 ]
@@ -497,42 +462,63 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
 
 [[package]]
 name = "indexmap"
-version = "2.2.6"
+version = "1.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
 dependencies = [
- "equivalent",
+ "autocfg",
  "hashbrown",
 ]
 
 [[package]]
-name = "is-terminal"
-version = "0.4.12"
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
+checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
 dependencies = [
- "hermit-abi 0.3.9",
+ "hermit-abi 0.3.1",
  "libc",
- "windows-sys",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys 0.45.0",
 ]
 
 [[package]]
 name = "is_ci"
-version = "1.2.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45"
+checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
 
 [[package]]
 name = "itoa"
-version = "1.0.11"
+version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
 
 [[package]]
 name = "js-sys"
-version = "0.3.69"
+version = "0.3.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
 dependencies = [
  "wasm-bindgen",
 ]
@@ -545,81 +531,100 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
 name = "libc"
-version = "0.2.154"
+version = "0.2.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
+checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
 
 [[package]]
-name = "libredox"
-version = "0.1.3"
+name = "link-cplusplus"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5"
 dependencies = [
- "bitflags 2.5.0",
- "libc",
+ "cc",
 ]
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
 
 [[package]]
 name = "log"
-version = "0.4.21"
+version = "0.4.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
 
 [[package]]
 name = "memchr"
-version = "2.7.2"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.2"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
 dependencies = [
  "adler",
 ]
 
 [[package]]
 name = "nix"
-version = "0.26.4"
+version = "0.26.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
+checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
 dependencies = [
- "bitflags 1.3.2",
+ "bitflags",
  "cfg-if",
  "libc",
+ "static_assertions",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
 ]
 
 [[package]]
 name = "num-traits"
-version = "0.2.18"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "object"
-version = "0.32.2"
+version = "0.30.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.19.0"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "os_str_bytes"
+version = "6.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
 
 [[package]]
 name = "owo-colors"
@@ -632,56 +637,53 @@ dependencies = [
 
 [[package]]
 name = "pin-project-lite"
-version = "0.2.14"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.81"
+version = "1.0.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
+checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.36"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
-name = "redox_users"
-version = "0.4.5"
+name = "redox_syscall"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
- "getrandom",
- "libredox",
- "thiserror",
+ "bitflags",
 ]
 
 [[package]]
-name = "regex"
-version = "1.10.4"
+name = "redox_users"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
 dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax",
+ "getrandom",
+ "redox_syscall",
+ "thiserror",
 ]
 
 [[package]]
-name = "regex-automata"
-version = "0.4.6"
+name = "regex"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -690,15 +692,15 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.3"
+version = "0.6.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 
 [[package]]
 name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b"
 
 [[package]]
 name = "rustc_version"
@@ -711,22 +713,23 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.34"
+version = "0.36.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+checksum = "6da3636faa25820d8648e0e31c5d519bbb01f72fdf57131f0f5f7da5fed36eab"
 dependencies = [
- "bitflags 2.5.0",
+ "bitflags",
  "errno",
+ "io-lifetimes",
  "libc",
  "linux-raw-sys",
- "windows-sys",
+ "windows-sys 0.45.0",
 ]
 
 [[package]]
 name = "ryu"
-version = "1.0.17"
+version = "1.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
 
 [[package]]
 name = "same-file"
@@ -737,26 +740,32 @@ dependencies = [
  "winapi-util",
 ]
 
+[[package]]
+name = "scratch"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1"
+
 [[package]]
 name = "semver"
-version = "1.0.22"
+version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
+checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
 
 [[package]]
 name = "serde"
-version = "1.0.199"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a"
+checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.199"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc"
+checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -765,18 +774,18 @@ dependencies = [
 
 [[package]]
 name = "serde_ignored"
-version = "0.1.10"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf"
+checksum = "94eb4a4087ba8bdf14a9208ac44fddbf55c01a6195f7edfc511ddaff6cae45a6"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.116"
+version = "1.0.94"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
+checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
 dependencies = [
  "itoa",
  "ryu",
@@ -785,18 +794,18 @@ dependencies = [
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "sharded-slab"
-version = "0.1.7"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
 dependencies = [
  "lazy_static",
 ]
@@ -815,9 +824,9 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
 
 [[package]]
 name = "signal-hook"
-version = "0.3.17"
+version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9"
 dependencies = [
  "libc",
  "signal-hook-registry",
@@ -825,18 +834,24 @@ dependencies = [
 
 [[package]]
 name = "signal-hook-registry"
-version = "1.4.2"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
 dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
 [[package]]
 name = "strsim"
-version = "0.11.1"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
 
 [[package]]
 name = "supports-color"
@@ -850,9 +865,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.60"
+version = "2.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
+checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -861,30 +876,40 @@ dependencies = [
 
 [[package]]
 name = "tempfile"
-version = "3.10.1"
+version = "3.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
 dependencies = [
  "cfg-if",
  "fastrand",
+ "redox_syscall",
  "rustix",
- "windows-sys",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
 ]
 
 [[package]]
 name = "thiserror"
-version = "1.0.59"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.59"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -893,19 +918,30 @@ dependencies = [
 
 [[package]]
 name = "thread_local"
-version = "1.1.8"
+version = "1.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
 dependencies = [
  "cfg-if",
  "once_cell",
 ]
 
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
 [[package]]
 name = "toml"
-version = "0.7.8"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
 dependencies = [
  "serde",
  "serde_spanned",
@@ -915,18 +951,18 @@ dependencies = [
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.19.15"
+version = "0.19.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
 dependencies = [
  "indexmap",
  "serde",
@@ -937,19 +973,20 @@ dependencies = [
 
 [[package]]
 name = "tracing"
-version = "0.1.40"
+version = "0.1.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
 dependencies = [
+ "cfg-if",
  "pin-project-lite",
  "tracing-core",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
 dependencies = [
  "once_cell",
  "valuable",
@@ -967,9 +1004,9 @@ dependencies = [
 
 [[package]]
 name = "tracing-subscriber"
-version = "0.3.18"
+version = "0.3.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
 dependencies = [
  "sharded-slab",
  "thread_local",
@@ -978,15 +1015,15 @@ dependencies = [
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.12"
+version = "1.0.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
 
 [[package]]
-name = "utf8parse"
-version = "0.2.1"
+name = "unicode-width"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
 
 [[package]]
 name = "valuable"
@@ -996,14 +1033,20 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
 
 [[package]]
 name = "walkdir"
-version = "2.5.0"
+version = "2.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
 dependencies = [
  "same-file",
  "winapi-util",
 ]
 
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
 [[package]]
 name = "wasi"
 version = "0.11.0+wasi-snapshot-preview1"
@@ -1012,9 +1055,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.92"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
 dependencies = [
  "cfg-if",
  "wasm-bindgen-macro",
@@ -1022,9 +1065,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.92"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
 dependencies = [
  "bumpalo",
  "log",
@@ -1037,9 +1080,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.92"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -1047,9 +1090,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.92"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1060,27 +1103,26 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.92"
+version = "0.2.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
 
 [[package]]
 name = "which"
-version = "4.4.2"
+version = "4.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
 dependencies = [
  "either",
- "home",
+ "libc",
  "once_cell",
- "rustix",
 ]
 
 [[package]]
 name = "wildmatch"
-version = "2.3.3"
+version = "2.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "939e59c1bc731542357fdaad98b209ef78c8743d652bb61439d16b16a79eb025"
+checksum = "ee583bdc5ff1cf9db20e9db5bb3ff4c3089a8f6b8b31aff265c9aba85812db86"
 
 [[package]]
 name = "winapi"
@@ -1100,11 +1142,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.8"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
 dependencies = [
- "windows-sys",
+ "winapi",
 ]
 
 [[package]]
@@ -1114,92 +1156,166 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
-name = "windows-core"
-version = "0.52.0"
+name = "windows"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.42.2",
 ]
 
 [[package]]
 name = "windows-sys"
-version = "0.52.0"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
 dependencies = [
- "windows-targets",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
 name = "windows-targets"
-version = "0.52.5"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
 ]
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.5"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.5"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.5"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
 [[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.5"
+name = "windows_i686_msvc"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.5"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.5"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.5"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.5"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
 [[package]]
 name = "winnow"
-version = "0.5.40"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
 dependencies = [
  "memchr",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index e8a10ae..ce668fd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,7 +17,7 @@ include = [
   "README.md",
   "assets/*",
 ]
-rust-version = "1.77.2"
+rust-version = "1.64"
 
 [features]
 default = []
@@ -35,7 +35,7 @@ thiserror = "1.0.38"
 home = "0.5.4"
 rustc_version = "0.4.0"
 toml = "0.7.0"
-which = { version = "4.4.0", default_features = false }
+which = { version = "4.4.0", default-features = false }
 shell-escape = "0.1.5"
 serde = { version = "1.0.152", features = ["derive"] }
 serde_json = { version = "1.0.91", features = ["raw_value"] }
@@ -86,12 +86,6 @@ search = "<!-- next-url -->"
 replace = "<!-- next-url -->\n\n[Unreleased]: https://github.com/cross-rs/{{crate_name}}/compare/v{{version}}...HEAD"
 exactly = 1
 
-[[package.metadata.release.pre-release-replacements]]
-file = "docs/config_file.md"
-search = "(# Translates to `.*?:).*?(-centos`)"
-replace = "${1}{{version}}$2"
-exactly = 1
-
 [package.metadata.binstall]
 pkg-url = "{ repo }/releases/download/v{ version }/{ name }-{ target }.tar.gz"
 bin-dir = "{ bin }{ binary-ext }"
diff --git a/README.md b/README.md
index b51cf93..60fa68c 100644
--- a/README.md
+++ b/README.md
@@ -56,7 +56,7 @@ cargo install cross --git https://github.com/cross-rs/cross
 ```
 
 It's also possible to directly download the pre-compiled [release
-binaries](https://github.com/cross-rs/cross/releases) or use
+binaries](https://github.com/cross-rs/cross/releases) or using
 [cargo-binstall](https://github.com/cargo-bins/cargo-binstall).
 
 ## Usage
@@ -102,7 +102,7 @@ config snippet would look like this:
 [workspace.metadata.cross.target.aarch64-unknown-linux-gnu]
 # Install libssl-dev:arm64, see <https://github.com/cross-rs/cross/blob/main/docs/custom_images.md#adding-dependencies-to-existing-images>
 pre-build = [
-    "dpkg --add-architecture $CROSS_DEB_ARCH",
+    "dpkg --add-architecture $CROSS_DEB_ARCH", 
     "apt-get update && apt-get --assume-yes install libssl-dev:$CROSS_DEB_ARCH"
 ]
 [workspace.metadata.cross.target.armv7-unknown-linux-gnueabi]
@@ -125,7 +125,7 @@ it should search for the config file. This way you are not limited to a
 #### Option 4: Configuring `cross` through environment variables
 
 Besides the TOML-based configuration files, config can be passed through
-[environment variables][docs_env_vars], too.
+[environment variables][docs_env_vars], too. 
 
 
 ### Docker in Docker
@@ -224,7 +224,7 @@ terminate.
 | `i686-linux-android` [1]               | 9.0.8  | 9.0.8  | ✓   | 6.1.0 |   ✓    |
 | `i686-pc-windows-gnu`                  | N/A    | 9.4    | ✓   | N/A   |   ✓    |
 | `i686-unknown-linux-gnu`               | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
-| `loongarch64-unknown-linux-gnu`        | 2.36   | 14.2.0 | ✓   | 8.2.2 |   ✓    |
+| `loongarch64-unknown-linux-gnu`        | 2.36   | 13.2.0 | ✓   | 8.2.2 |   ✓    |
 | `mips-unknown-linux-gnu`               | 2.30   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
 | `mips-unknown-linux-musl`              | 1.2.3  | 9.2.0  | ✓   | 6.1.0 |   ✓    |
 | `mips64-unknown-linux-gnuabi64`        | 2.30   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
@@ -236,7 +236,7 @@ terminate.
 | `powerpc-unknown-linux-gnu`            | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
 | `powerpc64-unknown-linux-gnu`          | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
 | `powerpc64le-unknown-linux-gnu`        | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
-| `riscv64gc-unknown-linux-gnu`          | 2.35   | 11.4.0 | ✓   | 8.2.2 |   ✓    |
+| `riscv64gc-unknown-linux-gnu`          | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
 | `s390x-unknown-linux-gnu`              | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
 | `sparc64-unknown-linux-gnu`            | 2.31   | 9.4.0  | ✓   | 6.1.0 |   ✓    |
 | `sparcv9-sun-solaris`                  | 1.22.7 | 8.4.0  | ✓   | N/A   |        |
@@ -252,7 +252,7 @@ terminate.
 | `wasm32-unknown-emscripten` [6]        | 3.1.14 | 15.0.0 | ✓   | N/A   |   ✓    |
 | `x86_64-linux-android` [1]             | 9.0.8  | 9.0.8  | ✓   | 6.1.0 |   ✓    |
 | `x86_64-pc-windows-gnu`                | N/A    | 9.3    | ✓   | N/A   |   ✓    |
-| `x86_64-pc-solaris`                    | 1.22.7 | 8.4.0  | ✓   | N/A   |        |
+| `x86_64-sun-solaris`                   | 1.22.7 | 8.4.0  | ✓   | N/A   |        |
 | `x86_64-unknown-freebsd`               | 1.5    | 6.4.0  | ✓   | N/A   |        |
 | `x86_64-unknown-dragonfly` [2] [3]     | 6.0.1  | 10.3.0 | ✓   | N/A   |        |
 | `x86_64-unknown-illumos`               | 1.20.4 | 8.4.0  | ✓   | N/A   |        |
@@ -275,14 +275,14 @@ terminate.
 
 [4] libc = newlib
 
-[5] Must change
+[5] Must change 
     `image = "ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos"` in
     `Cross.toml` for `[target.x86_64-unknown-linux-gnu]` to use the
     CentOS7-compatible target.
 
 [6] libc = emscripten and GCC = clang
 
-[7] Must change
+[7] Must change 
     `image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main-centos"` in
     `Cross.toml` for `[target.aarch64-unknown-linux-gnu]` to use the
     CentOS7-compatible target.
@@ -318,7 +318,7 @@ $ QEMU_STRACE=1 cross run --target aarch64-unknown-linux-gnu
 
 ## Minimum Supported Rust Version (MSRV)
 
-This crate is guaranteed to compile on stable Rust 1.77.2 and up. It *might*
+This crate is guaranteed to compile on stable Rust 1.64.0 and up. It *might*
 compile with older versions but that may change in any new patch release.
 
 Some cross-compilation targets require a later Rust version, and using Xargo
diff --git a/clippy.toml b/clippy.toml
index fe7b174..00fd94a 100644
--- a/clippy.toml
+++ b/clippy.toml
@@ -2,4 +2,4 @@ disallowed-methods = [
     { path = "std::path::Path::display", reason = "incorrect handling of non-Unicode paths, use path.to_utf8() or debug (`{path:?}`) instead" },
 ]
 allow-unwrap-in-tests = true
-msrv = "1.77.2"
+msrv = "1.64.0"
diff --git a/deny.toml b/deny.toml
index 756088c..4043db5 100644
--- a/deny.toml
+++ b/deny.toml
@@ -1,4 +1,4 @@
-[graph]
+
 # only check for the targets we currently publish
 targets = [
   { triple = "x86_64-apple-darwin" },
@@ -8,7 +8,10 @@ targets = [
 ]
 
 [advisories]
-version = 2
+vulnerability = "deny"
+unmaintained = "deny"
+notice = "deny"
+unsound = "deny"
 # FIXME: remove this if/when clap changes to is-terminal, atty is
 # patched, or we migrated to an MSRV of 1.66.0.
 ignore = [
@@ -19,7 +22,7 @@ ignore = [
 multiple-versions = "deny"
 deny = []
 skip-tree = [
-    { name = "nix", version = "=0.26.4", depth = 2 },
+    { name = "tempfile", version = "=3.4.0", depth = 2 },
 ]
 
 [sources]
@@ -28,9 +31,11 @@ unknown-git = "deny"
 allow-git = []
 
 [licenses]
-version = 2
 # need this since to suppress errors in case we add crates with these allowed licenses
 unused-allowed-license = "allow"
+unlicensed = "deny"
+allow-osi-fsf-free = "neither"
+copyleft = "deny"
 confidence-threshold = 0.93
 allow = [
   "Apache-2.0",
diff --git a/docker/Dockerfile.aarch64-unknown-linux-gnu b/docker/Dockerfile.aarch64-unknown-linux-gnu
index 85910e3..45daca9 100644
--- a/docker/Dockerfile.aarch64-unknown-linux-gnu
+++ b/docker/Dockerfile.aarch64-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-aarch64-linux-gnu \
-    gfortran-aarch64-linux-gnu \
     libc6-dev-arm64-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.arm-unknown-linux-gnueabi b/docker/Dockerfile.arm-unknown-linux-gnueabi
index a634161..3a610f8 100644
--- a/docker/Dockerfile.arm-unknown-linux-gnueabi
+++ b/docker/Dockerfile.arm-unknown-linux-gnueabi
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-arm-linux-gnueabi \
-    gfortran-arm-linux-gnueabi \
     libc6-dev-armel-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.armv5te-unknown-linux-gnueabi b/docker/Dockerfile.armv5te-unknown-linux-gnueabi
index 878d913..be6466c 100644
--- a/docker/Dockerfile.armv5te-unknown-linux-gnueabi
+++ b/docker/Dockerfile.armv5te-unknown-linux-gnueabi
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-arm-linux-gnueabi \
-    gfortran-arm-linux-gnueabi \
     crossbuild-essential-armel \
     libc6-dev-armel-cross
 
diff --git a/docker/Dockerfile.armv7-unknown-linux-gnueabi b/docker/Dockerfile.armv7-unknown-linux-gnueabi
index c1201c7..26cdf72 100644
--- a/docker/Dockerfile.armv7-unknown-linux-gnueabi
+++ b/docker/Dockerfile.armv7-unknown-linux-gnueabi
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get install --assume-yes --no-install-recommends \
     g++-arm-linux-gnueabi \
-    gfortran-arm-linux-gnueabi \
     libc6-dev-armel-cross
 
 COPY qemu.sh /
diff --git a/docker/Dockerfile.armv7-unknown-linux-gnueabihf b/docker/Dockerfile.armv7-unknown-linux-gnueabihf
index 37fac99..870ef25 100644
--- a/docker/Dockerfile.armv7-unknown-linux-gnueabihf
+++ b/docker/Dockerfile.armv7-unknown-linux-gnueabihf
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-arm-linux-gnueabihf \
-    gfortran-arm-linux-gnueabihf \
     libc6-dev-armhf-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.i586-unknown-linux-gnu b/docker/Dockerfile.i586-unknown-linux-gnu
index b003d0d..77f41a2 100644
--- a/docker/Dockerfile.i586-unknown-linux-gnu
+++ b/docker/Dockerfile.i586-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-i686-linux-gnu \
-    gfortran-i686-linux-gnu \
     libc6-dev-i386-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.i686-unknown-linux-gnu b/docker/Dockerfile.i686-unknown-linux-gnu
index ff634f6..b5c5783 100644
--- a/docker/Dockerfile.i686-unknown-linux-gnu
+++ b/docker/Dockerfile.i686-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-i686-linux-gnu \
-    gfortran-i686-linux-gnu \
     libc6-dev-i386-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.loongarch64-unknown-linux-gnu b/docker/Dockerfile.loongarch64-unknown-linux-gnu
index 8991dd8..58340b4 100644
--- a/docker/Dockerfile.loongarch64-unknown-linux-gnu
+++ b/docker/Dockerfile.loongarch64-unknown-linux-gnu
@@ -15,7 +15,7 @@ FROM cross-base as build
 ARG VERBOSE
 COPY crosstool-ng.sh /
 COPY crosstool-config/loongarch64-unknown-linux-gnu.config /
-RUN /crosstool-ng.sh loongarch64-unknown-linux-gnu.config 5 ed12fa68402f58e171a6f79500f73f4781fdc9e5
+RUN /crosstool-ng.sh loongarch64-unknown-linux-gnu.config 5
 
 ENV PATH /x-tools/loongarch64-unknown-linux-gnu/bin/:$PATH
 
diff --git a/docker/Dockerfile.mips-unknown-linux-gnu b/docker/Dockerfile.mips-unknown-linux-gnu
index 85ad391..8dabed8 100644
--- a/docker/Dockerfile.mips-unknown-linux-gnu
+++ b/docker/Dockerfile.mips-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get install --assume-yes --no-install-recommends \
     g++-mips-linux-gnu \
-    gfortran-mips-linux-gnu \
     libc6-dev-mips-cross
 
 COPY qemu.sh /
diff --git a/docker/Dockerfile.mips64-unknown-linux-gnuabi64 b/docker/Dockerfile.mips64-unknown-linux-gnuabi64
index aff54da..648d7f0 100644
--- a/docker/Dockerfile.mips64-unknown-linux-gnuabi64
+++ b/docker/Dockerfile.mips64-unknown-linux-gnuabi64
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-mips64-linux-gnuabi64 \
-    gfortran-mips64-linux-gnuabi64 \
     libc6-dev-mips64-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.mips64el-unknown-linux-gnuabi64 b/docker/Dockerfile.mips64el-unknown-linux-gnuabi64
index 2e86f1a..24dedf7 100644
--- a/docker/Dockerfile.mips64el-unknown-linux-gnuabi64
+++ b/docker/Dockerfile.mips64el-unknown-linux-gnuabi64
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-mips64el-linux-gnuabi64 \
-    gfortran-mips64el-linux-gnuabi64 \
     libc6-dev-mips64el-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.mipsel-unknown-linux-gnu b/docker/Dockerfile.mipsel-unknown-linux-gnu
index 39672a8..5887580 100644
--- a/docker/Dockerfile.mipsel-unknown-linux-gnu
+++ b/docker/Dockerfile.mipsel-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-mipsel-linux-gnu \
-    gfortran-mipsel-linux-gnu \
     libc6-dev-mipsel-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.powerpc-unknown-linux-gnu b/docker/Dockerfile.powerpc-unknown-linux-gnu
index e3c688c..1e65263 100644
--- a/docker/Dockerfile.powerpc-unknown-linux-gnu
+++ b/docker/Dockerfile.powerpc-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-powerpc-linux-gnu \
-    gfortran-powerpc-linux-gnu \
     libc6-dev-powerpc-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.powerpc64-unknown-linux-gnu b/docker/Dockerfile.powerpc64-unknown-linux-gnu
index faea35f..c7b63c7 100644
--- a/docker/Dockerfile.powerpc64-unknown-linux-gnu
+++ b/docker/Dockerfile.powerpc64-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-powerpc64-linux-gnu \
-    gfortran-powerpc64-linux-gnu \
     libc6-dev-ppc64-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.powerpc64le-unknown-linux-gnu b/docker/Dockerfile.powerpc64le-unknown-linux-gnu
index 728a589..bdab4a3 100644
--- a/docker/Dockerfile.powerpc64le-unknown-linux-gnu
+++ b/docker/Dockerfile.powerpc64le-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-powerpc64le-linux-gnu \
-    gfortran-powerpc64le-linux-gnu \
     libc6-dev-ppc64el-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.riscv64gc-unknown-linux-gnu b/docker/Dockerfile.riscv64gc-unknown-linux-gnu
index d5ea70a..100d12b 100644
--- a/docker/Dockerfile.riscv64gc-unknown-linux-gnu
+++ b/docker/Dockerfile.riscv64gc-unknown-linux-gnu
@@ -1,4 +1,4 @@
-FROM ubuntu:22.04 as cross-base
+FROM ubuntu:20.04 as cross-base
 ENV DEBIAN_FRONTEND=noninteractive
 
 COPY common.sh lib.sh /
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
     g++-riscv64-linux-gnu \
-    gfortran-riscv64-linux-gnu \
     libc6-dev-riscv64-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.s390x-unknown-linux-gnu b/docker/Dockerfile.s390x-unknown-linux-gnu
index 043afd7..f454300 100644
--- a/docker/Dockerfile.s390x-unknown-linux-gnu
+++ b/docker/Dockerfile.s390x-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-s390x-linux-gnu \
-    gfortran-s390x-linux-gnu \
     libc6-dev-s390x-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.sparc64-unknown-linux-gnu b/docker/Dockerfile.sparc64-unknown-linux-gnu
index cb620e6..0dc0a82 100644
--- a/docker/Dockerfile.sparc64-unknown-linux-gnu
+++ b/docker/Dockerfile.sparc64-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-sparc64-linux-gnu \
-    gfortran-sparc64-linux-gnu \
     libc6-dev-sparc64-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/Dockerfile.sparcv9-sun-solaris b/docker/Dockerfile.sparcv9-sun-solaris
index 814444b..d5b717b 100644
--- a/docker/Dockerfile.sparcv9-sun-solaris
+++ b/docker/Dockerfile.sparcv9-sun-solaris
@@ -13,7 +13,7 @@ RUN /xargo.sh
 FROM cross-base as build
 
 COPY solaris.sh /
-RUN /solaris.sh sparcv9 sun
+RUN /solaris.sh sparcv9
 
 COPY toolchain.cmake /opt/toolchain.cmake
 
diff --git a/docker/Dockerfile.thumbv7neon-unknown-linux-gnueabihf b/docker/Dockerfile.thumbv7neon-unknown-linux-gnueabihf
index 03ea06a..bcbc8a1 100644
--- a/docker/Dockerfile.thumbv7neon-unknown-linux-gnueabihf
+++ b/docker/Dockerfile.thumbv7neon-unknown-linux-gnueabihf
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-arm-linux-gnueabihf \
-    gfortran-arm-linux-gnueabihf \
     libc6-dev-armhf-cross
 
 COPY qemu.sh /
diff --git a/docker/Dockerfile.x86_64-pc-solaris b/docker/Dockerfile.x86_64-pc-solaris
deleted file mode 100644
index 8103d62..0000000
--- a/docker/Dockerfile.x86_64-pc-solaris
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM ubuntu:20.04 as cross-base
-ENV DEBIAN_FRONTEND=noninteractive
-
-COPY common.sh lib.sh /
-RUN /common.sh
-
-COPY cmake.sh /
-RUN /cmake.sh
-
-COPY xargo.sh /
-RUN /xargo.sh
-
-FROM cross-base as build
-
-COPY solaris.sh /
-RUN /solaris.sh x86_64 pc
-
-COPY toolchain.cmake /opt/toolchain.cmake
-
-ENV CROSS_TOOLCHAIN_PREFIX=x86_64-pc-solaris2.10-
-ENV CROSS_SYSROOT=/usr/local/x86_64-pc-solaris2.10
-ENV CARGO_TARGET_X86_64_PC_SOLARIS_LINKER="$CROSS_TOOLCHAIN_PREFIX"gcc \
-    AR_x86_64_pc_solaris="$CROSS_TOOLCHAIN_PREFIX"ar \
-    CC_x86_64_pc_solaris="$CROSS_TOOLCHAIN_PREFIX"gcc \
-    CXX_x86_64_pc_solaris="$CROSS_TOOLCHAIN_PREFIX"g++ \
-    CMAKE_TOOLCHAIN_FILE_x86_64_pc_solaris=/opt/toolchain.cmake \
-    BINDGEN_EXTRA_CLANG_ARGS_x86_64_pc_solaris="--sysroot=$CROSS_SYSROOT" \
-    CROSS_CMAKE_SYSTEM_NAME=SunOS \
-    CROSS_CMAKE_SYSTEM_PROCESSOR=x86_64 \
-    CROSS_CMAKE_CRT=solaris \
-    CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC -m64"
diff --git a/docker/Dockerfile.x86_64-pc-windows-gnu b/docker/Dockerfile.x86_64-pc-windows-gnu
index a3fa0d5..bfa7f0d 100644
--- a/docker/Dockerfile.x86_64-pc-windows-gnu
+++ b/docker/Dockerfile.x86_64-pc-windows-gnu
@@ -18,7 +18,7 @@ RUN dpkg --add-architecture i386 && apt-get update && \
 COPY wine.sh /
 RUN /wine.sh
 
-RUN apt-get update && apt-get install --assume-yes --no-install-recommends g++-mingw-w64-x86-64 gfortran-mingw-w64-x86-64
+RUN apt-get update && apt-get install --assume-yes --no-install-recommends g++-mingw-w64-x86-64
 
 # run-detectors are responsible for calling the correct interpreter for exe
 # files. For some reason it does not work inside a docker container (it works
diff --git a/docker/Dockerfile.x86_64-sun-solaris b/docker/Dockerfile.x86_64-sun-solaris
new file mode 100644
index 0000000..e4af431
--- /dev/null
+++ b/docker/Dockerfile.x86_64-sun-solaris
@@ -0,0 +1,31 @@
+FROM ubuntu:20.04 as cross-base
+ENV DEBIAN_FRONTEND=noninteractive
+
+COPY common.sh lib.sh /
+RUN /common.sh
+
+COPY cmake.sh /
+RUN /cmake.sh
+
+COPY xargo.sh /
+RUN /xargo.sh
+
+FROM cross-base as build
+
+COPY solaris.sh /
+RUN /solaris.sh x86_64
+
+COPY toolchain.cmake /opt/toolchain.cmake
+
+ENV CROSS_TOOLCHAIN_PREFIX=x86_64-sun-solaris2.10-
+ENV CROSS_SYSROOT=/usr/local/x86_64-sun-solaris2.10
+ENV CARGO_TARGET_X86_64_SUN_SOLARIS_LINKER="$CROSS_TOOLCHAIN_PREFIX"gcc \
+    AR_x86_64_sun_solaris="$CROSS_TOOLCHAIN_PREFIX"ar \
+    CC_x86_64_sun_solaris="$CROSS_TOOLCHAIN_PREFIX"gcc \
+    CXX_x86_64_sun_solaris="$CROSS_TOOLCHAIN_PREFIX"g++ \
+    CMAKE_TOOLCHAIN_FILE_x86_64_sun_solaris=/opt/toolchain.cmake \
+    BINDGEN_EXTRA_CLANG_ARGS_x86_64_sun_solaris="--sysroot=$CROSS_SYSROOT" \
+    CROSS_CMAKE_SYSTEM_NAME=SunOS \
+    CROSS_CMAKE_SYSTEM_PROCESSOR=x86_64 \
+    CROSS_CMAKE_CRT=solaris \
+    CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC -m64"
diff --git a/docker/Dockerfile.x86_64-unknown-linux-gnu b/docker/Dockerfile.x86_64-unknown-linux-gnu
index 719b519..9623ef3 100644
--- a/docker/Dockerfile.x86_64-unknown-linux-gnu
+++ b/docker/Dockerfile.x86_64-unknown-linux-gnu
@@ -14,7 +14,6 @@ FROM cross-base as build
 
 RUN apt-get update && apt-get install --assume-yes --no-install-recommends \
     g++-x86-64-linux-gnu \
-    gfortran-x86-64-linux-gnu \
     libc6-dev-amd64-cross
 
 COPY deny-debian-packages.sh /
diff --git a/docker/aarch64-linux-gnu-glibc.sh b/docker/aarch64-linux-gnu-glibc.sh
index adfe470..a071eb5 100755
--- a/docker/aarch64-linux-gnu-glibc.sh
+++ b/docker/aarch64-linux-gnu-glibc.sh
@@ -40,7 +40,7 @@ cp_gcc_archive() {
 main() {
     set_centos_ulimit
     yum install -y epel-release
-    yum install -y gcc-aarch64-linux-gnu gcc-c++-aarch64-linux-gnu gfortran-c++-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils gcc-c++ glibc-devel
+    yum install -y gcc-aarch64-linux-gnu gcc-c++-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils gcc-c++ glibc-devel
     yum clean all
 
     local td
diff --git a/docker/common.sh b/docker/common.sh
index aca4d7a..24d5619 100755
--- a/docker/common.sh
+++ b/docker/common.sh
@@ -30,13 +30,11 @@ install_packages \
 if_centos install_packages \
     clang-devel \
     gcc-c++ \
-    gcc-gfortran \
     glibc-devel \
     pkgconfig
 
 if_ubuntu install_packages \
     g++ \
-    gfortran \
     libc6-dev \
     libclang-dev \
     pkg-config
diff --git a/docker/crosstool-config/loongarch64-unknown-linux-gnu.config b/docker/crosstool-config/loongarch64-unknown-linux-gnu.config
index 7de2835..f45344d 100644
--- a/docker/crosstool-config/loongarch64-unknown-linux-gnu.config
+++ b/docker/crosstool-config/loongarch64-unknown-linux-gnu.config
@@ -21,9 +21,9 @@ CT_GLIBC_VERSION="2.36"
 CT_GLIBC_2_17_or_later=y
 CT_GLIBC_later_than_2_14=y
 CT_GLIBC_2_14_or_later=y
-CT_GCC_V_14=y
+CT_GCC_V_13=y
 # CT_GCC_NO_VERSIONS is not set
-CT_GCC_VERSION="14.2.0"
+CT_GCC_VERSION="13.2.0"
 CT_GCC_later_than_7=y
 CT_GCC_7_or_later=y
 CT_GCC_later_than_6=y
diff --git a/docker/crosstool-ng.sh b/docker/crosstool-ng.sh
index 012dc4d..fd5a5c8 100755
--- a/docker/crosstool-ng.sh
+++ b/docker/crosstool-ng.sh
@@ -17,8 +17,8 @@ silence_stdout() {
 main() {
     local config="${1}"
     local nproc="${2}"
-    local ctng_version=${3:-crosstool-ng-1.26.0}
-    local ctng_url="https://github.com/crosstool-ng/crosstool-ng"
+    local ctng_version=1.26.0
+    local ctng_url="https://github.com/crosstool-ng/crosstool-ng/archive/crosstool-ng-${ctng_version}.tar.gz"
     local username=crosstool
     local crosstooldir=/opt/crosstool
     local buildir
@@ -51,11 +51,8 @@ main() {
 
     pushd "${td}"
 
-    mkdir "crosstool-ng-${ctng_version}"
-    pushd "crosstool-ng-${ctng_version}"
-    git init
-    git fetch --depth=1 "${ctng_url}" "${ctng_version}"
-    git reset --hard FETCH_HEAD
+    curl --retry 3 -sSfL "${ctng_url}" | tar xzf -
+    pushd "crosstool-ng-crosstool-ng-${ctng_version}"
     ./bootstrap
     ./configure --prefix="${crosstooldir}"
     make -j"${nproc}"
diff --git a/docker/dragonfly.sh b/docker/dragonfly.sh
index b61ac9e..75652e4 100755
--- a/docker/dragonfly.sh
+++ b/docker/dragonfly.sh
@@ -95,7 +95,7 @@ EOF
         --disable-lto \
         --disable-multilib \
         --disable-nls \
-        --enable-languages=c,c++,fortran \
+        --enable-languages=c,c++ \
         --target="${target}"
     make "-j${nproc}"
     make install
diff --git a/docker/freebsd.sh b/docker/freebsd.sh
index 108d04f..e144f40 100755
--- a/docker/freebsd.sh
+++ b/docker/freebsd.sh
@@ -228,7 +228,7 @@ main() {
         --disable-libvtv \
         --disable-lto \
         --disable-nls \
-        --enable-languages=c,c++,fortran \
+        --enable-languages=c,c++ \
         --target="${target}"
     make "-j$(nproc)"
     make install
diff --git a/docker/illumos.sh b/docker/illumos.sh
index c3662b6..cf3168f 100755
--- a/docker/illumos.sh
+++ b/docker/illumos.sh
@@ -104,7 +104,7 @@ main() {
         --target="${build_target}" \
         --program-prefix="${target}-" \
         --with-sysroot="${sysroot_dir}" \
-        --enable-languages=c,c++,fortran \
+        --enable-languages=c,c++ \
         --disable-libada \
         --disable-libcilkrts \
         --disable-libgomp \
diff --git a/docker/lib.sh b/docker/lib.sh
index 248374f..dbd225b 100644
--- a/docker/lib.sh
+++ b/docker/lib.sh
@@ -54,18 +54,6 @@ if_ubuntu() {
     fi
 }
 
-if_ubuntu_ge() {
-    if grep -q -i ubuntu /etc/os-release; then
-        local ver
-        ver="$(source /etc/os-release; echo $VERSION_ID)"
-        if dpkg --compare-versions "$ver" "ge" "$1"; then
-            shift
-            eval "${@}"
-        fi
-    fi
-}
-
-
 GNU_MIRRORS=(
     "https://ftp.gnu.org/gnu/"
     "https://ftpmirror.gnu.org/"
diff --git a/docker/linux-image.sh b/docker/linux-image.sh
index 745ac2f..58094f9 100755
--- a/docker/linux-image.sh
+++ b/docker/linux-image.sh
@@ -137,7 +137,9 @@ main() {
         ;;
     riscv64)
         kernel='6.*-riscv64'
-        debsource="deb http://deb.debian.org/debian unstable main"
+        debsource="deb http://ftp.ports.debian.org/debian-ports unstable main"
+        debsource="${debsource}\ndeb http://ftp.ports.debian.org/debian-ports unreleased main"
+        debsource="${debsource}\ndeb http://deb.debian.org/debian unstable main"
         deps=(libcrypt1:"${arch}")
         ;;
     s390x)
@@ -363,7 +365,6 @@ mkdir /dev/pts
 mount -t devpts none /dev/pts/
 
 # some archs does not have virtio modules
-# fscache is builtin on riscv64
 insmod /modules/failover.ko || insmod /modules/failover.ko.xz || true
 insmod /modules/net_failover.ko || insmod /modules/net_failover.ko.xz || true
 insmod /modules/virtio.ko || insmod /modules/virtio.ko.xz || true
@@ -374,7 +375,7 @@ insmod /modules/virtio_pci_modern_dev.ko || insmod /modules/virtio_pci_modern_de
 insmod /modules/virtio_pci.ko || insmod /modules/virtio_pci.ko.xz || true
 insmod /modules/virtio_net.ko || insmod /modules/virtio_net.ko.xz || true
 insmod /modules/netfs.ko || insmod /modules/netfs.ko.xz || true
-insmod /modules/fscache.ko || insmod /modules/fscache.ko.xz || true
+insmod /modules/fscache.ko || insmod /modules/fscache.ko.xz
 insmod /modules/9pnet.ko || insmod /modules/9pnet.ko.xz
 insmod /modules/9pnet_virtio.ko || insmod /modules/9pnet_virtio.ko.xz || true
 insmod /modules/9p.ko || insmod /modules/9p.ko.xz
@@ -389,12 +390,6 @@ mount -t 9p -o trans=virtio target /target -oversion=9p2000.u || true
 exec dropbear -F -E -B
 EOF
 
-    if [[ "${arch}" == "riscv64" ]]; then
-        # Symlink dynamic loader to /lib/ld-linux-riscv64-lp64d.so.1
-        mkdir -p "${root}/lib"
-        ln -s /usr/lib/riscv64-linux-gnu/ld-linux-riscv64-lp64d.so.1 "${root}/lib/ld-linux-riscv64-lp64d.so.1"
-    fi
-
     chmod +x "${root}/init"
     cd "${root}"
     find . | cpio --create --format='newc' --quiet | gzip >../initrd.gz
diff --git a/docker/musl.sh b/docker/musl.sh
index e0d4fed..61411d8 100755
--- a/docker/musl.sh
+++ b/docker/musl.sh
@@ -51,7 +51,7 @@ main() {
         LINUX_HEADERS_SITE="${linux_headers_site}" \
         LINUX_VER="${linux_ver}" \
         OUTPUT=/usr/local/ \
-        "GCC_CONFIG += --enable-default-pie --enable-languages=c,c++,fortran" \
+        "GCC_CONFIG += --enable-default-pie" \
         "${@}"
 
     purge_packages
diff --git a/docker/netbsd.sh b/docker/netbsd.sh
index 12d0739..b0ce0ee 100755
--- a/docker/netbsd.sh
+++ b/docker/netbsd.sh
@@ -38,9 +38,8 @@ main() {
     sed -i -e 's/ftp:/https:/g' ./contrib/download_prerequisites
     ./contrib/download_prerequisites
     local patches=(
-        https://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/lang/gcc9/patches/patch-libstdc++-v3_config_os_bsd_netbsd_ctype__configure__char.cc
         https://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/lang/gcc9/patches/patch-libstdc++-v3_config_os_bsd_netbsd_ctype__base.h
-        https://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/lang/gcc8/patches/patch-libgfortran_io_io.h
+        https://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/lang/gcc9/patches/patch-libstdc++-v3_config_os_bsd_netbsd_ctype__configure__char.cc
     )
 
     local patch
@@ -93,8 +92,7 @@ main() {
     ln -s libutil.so.7.24 "${destdir}/lib/libutil.so.7"
 
     pushd gcc-build
-    # remove the environment variables after bumping the gcc version to 11.
-    target_configargs="ac_cv_func_newlocale=no ac_cv_func_freelocale=no ac_cv_func_uselocale=no" ../gcc/configure \
+    ../gcc/configure \
         --disable-libada \
         --disable-libcilkrt \
         --disable-libcilkrts \
@@ -107,7 +105,7 @@ main() {
         --disable-lto \
         --disable-multilib \
         --disable-nls \
-        --enable-languages=c,c++,fortran \
+        --enable-languages=c,c++ \
         --target="${target}"
     make "-j$(nproc)"
     make install
diff --git a/docker/qemu.sh b/docker/qemu.sh
index f56dfc8..bef0613 100755
--- a/docker/qemu.sh
+++ b/docker/qemu.sh
@@ -29,10 +29,6 @@ build_static_libffi () {
 build_static_libmount () {
     local version_spec=2.23.2
     local version=2.23
-
-    if_ubuntu_ge 22.04 version_spec=2.37.2
-    if_ubuntu_ge 22.04 version=2.37
-
     local td
     td="$(mktemp -d)"
 
@@ -195,9 +191,6 @@ main() {
         libselinux1-dev \
         zlib1g-dev
 
-    # ubuntu no longer provides statically linked libmount
-    if_ubuntu_ge 22.04 build_static_libmount
-
     # if we have python3.6+, we can install qemu 7.0.0, which needs ninja-build
     # ubuntu 16.04 only provides python3.5, so remove when we have a newer qemu.
     is_ge_python36=$(python3 -c "import sys; print(int(sys.version_info >= (3, 6)))")
diff --git a/docker/solaris.sh b/docker/solaris.sh
index a7ba0da..68796eb 100755
--- a/docker/solaris.sh
+++ b/docker/solaris.sh
@@ -8,11 +8,10 @@ set -euo pipefail
 
 main() {
     local arch="${1}"
-    local manufacturer="${2}"
 
     local binutils=2.28.1 \
         gcc=8.4.0 \
-        target="${arch}-${manufacturer}-solaris2.10"
+        target="${arch}-sun-solaris2.10"
 
     install_packages bzip2 \
         ca-certificates \
@@ -57,33 +56,28 @@ main() {
     esac
 
     apt-key adv --batch --yes --keyserver keyserver.ubuntu.com --recv-keys 74DA7924C5513486
-    add-apt-repository -y 'deb http://apt.dilos.org/dilos dilos2 main'
+    add-apt-repository -y 'deb http://apt.dilos.org/dilos dilos2-testing main'
     dpkg --add-architecture "${apt_arch}"
     apt-get update
-    apt-get install -y --download-only \
+    # shellcheck disable=SC2046
+    apt-get download $(apt-cache depends --recurse --no-replaces \
         "libc:${apt_arch}"            \
+        "liblgrp-dev:${apt_arch}"     \
         "liblgrp:${apt_arch}"         \
         "libm-dev:${apt_arch}"        \
         "libpthread:${apt_arch}"      \
         "libresolv:${apt_arch}"       \
         "librt:${apt_arch}"           \
+        "libsendfile-dev:${apt_arch}" \
         "libsendfile:${apt_arch}"     \
         "libsocket:${apt_arch}"       \
         "system-crt:${apt_arch}"      \
-        "system-header:${apt_arch}"
+        "system-header:${apt_arch}"   \
+        | grep "^\w")
 
-    for deb in /var/cache/apt/archives/*"${apt_arch}.deb"; do
+    for deb in *"${apt_arch}.deb"; do
         dpkg -x "${deb}" "${td}/solaris"
     done
-    apt-get clean
-
-    # The -dev packages are not available from the apt repository we're using.
-    # However, those packages are just symlinks from *.so to *.so.<version>.
-    # This makes all those symlinks.
-    while IFS= read -r -d '' lib; do
-        link_name=${lib%.so.*}.so
-        [ -e "$link_name" ] || ln -sf "${lib##*/}" "$link_name"
-    done < <(find . -name '*.so.*' -print0)
 
     cd binutils-build
     ../binutils/configure \
@@ -127,7 +121,7 @@ EOF
         --disable-lto \
         --disable-multilib \
         --disable-nls \
-        --enable-languages=c,c++,fortran \
+        --enable-languages=c,c++ \
         --with-gnu-as \
         --with-gnu-ld \
         --target="${target}"
diff --git a/docker/wine.sh b/docker/wine.sh
index b449e82..28b8183 100755
--- a/docker/wine.sh
+++ b/docker/wine.sh
@@ -7,7 +7,7 @@ set -euo pipefail
 . lib.sh
 
 main() {
-    local version="9.0.0.0~focal-1"
+    local version="8.0.2~focal-1"
     install_packages wget
 
     dpkg --add-architecture i386
diff --git a/docs/config_file.md b/docs/config_file.md
index be67ee1..13d935f 100644
--- a/docs/config_file.md
+++ b/docs/config_file.md
@@ -161,10 +161,10 @@ targets:
 
 ```toml
 [target.aarch64-unknown-linux-gnu]
-build-std = ["core", "alloc"]   # always build the `core` and `alloc` crates from the std library. has precedence over xargo
-xargo = false                   # disable the use of xargo
-image = "test-image"            # use a different image for the target
-runner = "qemu-user"            # wrapper to run the binary (must be `qemu-system`, `qemu-user`, or `native`).
+build-std = false          # always build the std library. has precedence over xargo
+xargo = false              # disable the use of xargo
+image = "test-image"       # use a different image for the target
+runner = "qemu-user"       # wrapper to run the binary (must be `qemu-system`, `qemu-user`, or `native`).
 ```
 
 
@@ -221,27 +221,6 @@ the default one. Normal Docker behavior applies, so:
 - If only `image:latest` is specified, then Docker won't look in Docker Hub.
 - If the tag is omitted, then Docker will use the `latest` tag.
 
-If you specify a tag but no image name, `cross` will use the default image with
-the tag you provided:
-
-```toml
-[target.aarch64-unknown-linux-gnu]
-# Translates to `ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge`
-image = ":edge"
-
-[target.x86_64-unknown-linux-musl]
-# Translates to `ghcr.io/cross-rs/x86_64-unknown-linux-musl@sha256:77db671d8356a64ae72a3e1415e63f547f26d374fbe3c4762c1cd36c7eac7b99`
-image = "@sha256:77db671d8356a64ae72a3e1415e63f547f26d374fbe3c4762c1cd36c7eac7b99"
-```
-
-You can also specify a subtarget with no tag nor image name:
-
-```toml
-[target.x86_64-unknown-linux-gnu]
-# Translates to `ghcr.io/cross-rs/x86_64-unknown-linux-gnu:0.3.0-centos`
-image = "-centos"
-```
-
 The `image` key can also take the toolchains/platforms supported by the image:
 
 ```toml
diff --git a/src/bin/commands/run.rs b/src/bin/commands/run.rs
index 836a90b..e6ad62a 100644
--- a/src/bin/commands/run.rs
+++ b/src/bin/commands/run.rs
@@ -66,7 +66,7 @@ impl Run {
             let image = match docker::get_image(&config, &target, false) {
                 Ok(i) => i,
                 Err(docker::GetImageError::NoCompatibleImages(..))
-                    if config.dockerfile(&target).is_some() =>
+                    if config.dockerfile(&target)?.is_some() =>
                 {
                     "scratch".into()
                 }
@@ -76,7 +76,7 @@ impl Run {
                 }
             };
 
-            let image = image.to_definite_with(&engine, msg_info)?;
+            let image = image.to_definite_with(&engine, msg_info);
 
             let paths = docker::DockerPaths::create(&engine, metadata, cwd, toolchain, msg_info)?;
             let options = docker::DockerOptions::new(
diff --git a/src/config.rs b/src/config.rs
index 0979ef7..6b7ab8c 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -1,50 +1,17 @@
-use crate::cross_toml::BuildStd;
 use crate::docker::custom::PreBuild;
 use crate::docker::{ImagePlatform, PossibleImage};
 use crate::shell::MessageInfo;
 use crate::{CrossToml, Result, Target, TargetList};
 
-use std::borrow::Cow;
 use std::collections::HashMap;
 use std::env;
 use std::str::FromStr;
 
 #[derive(Debug)]
-pub struct ConfVal<T> {
-    pub build: Option<T>,
-    pub target: Option<T>,
-}
-
-impl<T> ConfVal<T> {
-    pub fn new(build: Option<T>, target: Option<T>) -> Self {
-        Self { build, target }
-    }
-
-    pub fn map<U, F: Fn(T) -> U>(self, f: F) -> ConfVal<U> {
-        ConfVal {
-            build: self.build.map(&f),
-            target: self.target.map(&f),
-        }
-    }
-}
-
-impl<T> Default for ConfVal<T> {
-    fn default() -> Self {
-        Self::new(None, None)
-    }
-}
-
-impl<T: PartialEq> PartialEq<(Option<T>, Option<T>)> for ConfVal<T> {
-    fn eq(&self, other: &(Option<T>, Option<T>)) -> bool {
-        self.build == other.0 && self.target == other.1
-    }
-}
-
-#[derive(Debug)]
-pub(crate) struct Environment(&'static str, Option<HashMap<&'static str, &'static str>>);
+struct Environment(&'static str, Option<HashMap<&'static str, &'static str>>);
 
 impl Environment {
-    pub(crate) fn new(map: Option<HashMap<&'static str, &'static str>>) -> Self {
+    fn new(map: Option<HashMap<&'static str, &'static str>>) -> Self {
         Environment("CROSS", map)
     }
 
@@ -64,11 +31,12 @@ impl Environment {
         var: &str,
         target: &Target,
         convert: impl Fn(&str) -> T,
-    ) -> ConfVal<T> {
-        let build_values = self.get_build_var(var).map(|ref s| convert(s));
+    ) -> (Option<T>, Option<T>) {
         let target_values = self.get_target_var(target, var).map(|ref s| convert(s));
 
-        ConfVal::new(build_values, target_values)
+        let build_values = self.get_build_var(var).map(|ref s| convert(s));
+
+        (build_values, target_values)
     }
 
     fn target_path(target: &Target, key: &str) -> String {
@@ -91,29 +59,23 @@ impl Environment {
         self.get_var(&self.build_var_name(&Self::target_path(target, key)))
     }
 
-    fn xargo(&self, target: &Target) -> ConfVal<bool> {
+    fn xargo(&self, target: &Target) -> (Option<bool>, Option<bool>) {
         self.get_values_for("XARGO", target, bool_from_envvar)
     }
 
-    fn build_std(&self, target: &Target) -> ConfVal<BuildStd> {
-        self.get_values_for("BUILD_STD", target, |v| {
-            if let Some(value) = try_bool_from_envvar(v) {
-                BuildStd::Bool(value)
-            } else {
-                BuildStd::Crates(v.split(',').map(str::to_owned).collect())
-            }
-        })
+    fn build_std(&self, target: &Target) -> (Option<bool>, Option<bool>) {
+        self.get_values_for("BUILD_STD", target, bool_from_envvar)
     }
 
-    fn zig(&self, target: &Target) -> ConfVal<bool> {
+    fn zig(&self, target: &Target) -> (Option<bool>, Option<bool>) {
         self.get_values_for("ZIG", target, bool_from_envvar)
     }
 
-    fn zig_version(&self, target: &Target) -> ConfVal<String> {
+    fn zig_version(&self, target: &Target) -> (Option<String>, Option<String>) {
         self.get_values_for("ZIG_VERSION", target, ToOwned::to_owned)
     }
 
-    fn zig_image(&self, target: &Target) -> Result<ConfVal<PossibleImage>> {
+    fn zig_image(&self, target: &Target) -> Result<(Option<PossibleImage>, Option<PossibleImage>)> {
         let get_build = |env: &Environment, var: &str| env.get_build_var(var);
         let get_target = |env: &Environment, var: &str| env.get_target_var(target, var);
         let env_build = get_possible_image(
@@ -131,7 +93,7 @@ impl Environment {
             get_target,
         )?;
 
-        Ok(ConfVal::new(env_build, env_target))
+        Ok((env_build, env_target))
     }
 
     fn image(&self, target: &Target) -> Result<Option<PossibleImage>> {
@@ -139,15 +101,15 @@ impl Environment {
         get_possible_image(self, "IMAGE", "IMAGE_TOOLCHAIN", get_target, get_target)
     }
 
-    fn dockerfile(&self, target: &Target) -> ConfVal<String> {
+    fn dockerfile(&self, target: &Target) -> (Option<String>, Option<String>) {
         self.get_values_for("DOCKERFILE", target, ToOwned::to_owned)
     }
 
-    fn dockerfile_context(&self, target: &Target) -> ConfVal<String> {
+    fn dockerfile_context(&self, target: &Target) -> (Option<String>, Option<String>) {
         self.get_values_for("DOCKERFILE_CONTEXT", target, ToOwned::to_owned)
     }
 
-    fn pre_build(&self, target: &Target) -> ConfVal<PreBuild> {
+    fn pre_build(&self, target: &Target) -> (Option<PreBuild>, Option<PreBuild>) {
         self.get_values_for("PRE_BUILD", target, |v| {
             let v: Vec<_> = v.split('\n').map(String::from).collect();
             if v.len() == 1 {
@@ -165,11 +127,11 @@ impl Environment {
         self.get_target_var(target, "RUNNER")
     }
 
-    fn passthrough(&self, target: &Target) -> ConfVal<Vec<String>> {
+    fn passthrough(&self, target: &Target) -> (Option<Vec<String>>, Option<Vec<String>>) {
         self.get_values_for("ENV_PASSTHROUGH", target, split_to_cloned_by_ws)
     }
 
-    fn volumes(&self, target: &Target) -> ConfVal<Vec<String>> {
+    fn volumes(&self, target: &Target) -> (Option<Vec<String>>, Option<Vec<String>>) {
         self.get_values_for("ENV_VOLUMES", target, split_to_cloned_by_ws)
     }
 
@@ -227,16 +189,12 @@ fn split_to_cloned_by_ws(string: &str) -> Vec<String> {
 /// this takes the value of the environment variable,
 /// so you should call `bool_from_envvar(env::var("FOO"))`
 pub fn bool_from_envvar(envvar: &str) -> bool {
-    try_bool_from_envvar(envvar).unwrap_or(!envvar.is_empty())
-}
-
-pub fn try_bool_from_envvar(envvar: &str) -> Option<bool> {
     if let Ok(value) = bool::from_str(envvar) {
-        Some(value)
+        value
     } else if let Ok(value) = i32::from_str(envvar) {
-        Some(value != 0)
+        value != 0
     } else {
-        None
+        !envvar.is_empty()
     }
 }
 
@@ -274,33 +232,30 @@ impl Config {
         Ok(())
     }
 
-    fn get_from_value_inner<T, U>(
+    fn bool_from_config(
         &self,
         target: &Target,
-        env: impl for<'a> FnOnce(&'a Environment, &Target) -> ConfVal<T>,
-        config: impl for<'a> FnOnce(&'a CrossToml, &Target) -> ConfVal<Cow<'a, U>>,
-    ) -> Option<T>
-    where
-        U: ToOwned<Owned = T> + ?Sized,
-    {
-        let env = env(&self.env, target);
-        let toml = self
-            .toml
-            .as_ref()
-            .map(|toml| config(toml, target))
-            .unwrap_or_default();
+        env: impl Fn(&Environment, &Target) -> (Option<bool>, Option<bool>),
+        config: impl Fn(&CrossToml, &Target) -> (Option<bool>, Option<bool>),
+    ) -> Option<bool> {
+        let (env_build, env_target) = env(&self.env, target);
+        let (toml_build, toml_target) = if let Some(ref toml) = self.toml {
+            config(toml, target)
+        } else {
+            (None, None)
+        };
 
-        match (env.target, toml.target) {
+        match (env_target, toml_target) {
             (Some(value), _) => return Some(value),
-            (None, Some(value)) => return Some(value.into_owned()),
+            (None, Some(value)) => return Some(value),
             (None, None) => {}
-        }
+        };
 
-        match (env.build, toml.build) {
+        match (env_build, toml_build) {
             (Some(value), _) => return Some(value),
-            (None, Some(value)) => return Some(value.into_owned()),
+            (None, Some(value)) => return Some(value),
             (None, None) => {}
-        }
+        };
 
         None
     }
@@ -308,16 +263,16 @@ impl Config {
     fn vec_from_config(
         &self,
         target: &Target,
-        env: impl for<'a> FnOnce(&'a Environment, &Target) -> ConfVal<Vec<String>>,
-        config: impl for<'a> FnOnce(&'a CrossToml, &Target) -> ConfVal<&'a [String]>,
+        env: impl for<'a> Fn(&'a Environment, &Target) -> (Option<Vec<String>>, Option<Vec<String>>),
+        config: impl for<'a> Fn(&'a CrossToml, &Target) -> (Option<&'a [String]>, Option<&'a [String]>),
         sum: bool,
-    ) -> Option<Vec<String>> {
+    ) -> Result<Option<Vec<String>>> {
         if sum {
-            let mut env = env(&self.env, target);
-            if let (Some(b), Some(t)) = (&mut env.build, &mut env.target) {
-                b.append(t);
-            }
-            self.sum_of_env_toml_values(env.build, |t| config(t, target))
+            let (mut env_build, env_target) = env(&self.env, target);
+            env_build
+                .as_mut()
+                .map(|b| env_target.map(|mut t| b.append(&mut t)));
+            self.sum_of_env_toml_values(env_build, |t| config(t, target))
         } else {
             self.get_from_ref(target, env, config)
         }
@@ -326,71 +281,106 @@ impl Config {
     fn get_from_ref<T, U>(
         &self,
         target: &Target,
-        env: impl for<'a> FnOnce(&'a Environment, &Target) -> ConfVal<T>,
-        config: impl for<'a> FnOnce(&'a CrossToml, &Target) -> ConfVal<&'a U>,
-    ) -> Option<T>
+        env: impl for<'a> Fn(&'a Environment, &Target) -> (Option<T>, Option<T>),
+        config: impl for<'a> Fn(&'a CrossToml, &Target) -> (Option<&'a U>, Option<&'a U>),
+    ) -> Result<Option<T>>
     where
         U: ToOwned<Owned = T> + ?Sized,
     {
-        self.get_from_value_inner(target, env, |toml, target| {
-            config(toml, target).map(|v| Cow::Borrowed(v))
-        })
+        let (env_build, env_target) = env(&self.env, target);
+
+        if let Some(env_target) = env_target {
+            return Ok(Some(env_target));
+        }
+
+        let (build, target) = self
+            .toml
+            .as_ref()
+            .map(|t| config(t, target))
+            .unwrap_or_default();
+
+        // FIXME: let expression
+        if target.is_none() && env_build.is_some() {
+            return Ok(env_build);
+        }
+
+        if target.is_none() {
+            Ok(build.map(ToOwned::to_owned))
+        } else {
+            Ok(target.map(ToOwned::to_owned))
+        }
     }
 
     fn get_from_value<T>(
         &self,
         target: &Target,
-        env: impl FnOnce(&Environment, &Target) -> ConfVal<T>,
-        config: impl FnOnce(&CrossToml, &Target) -> ConfVal<T>,
-    ) -> Option<T>
-    where
-        T: ToOwned<Owned = T>,
-    {
-        self.get_from_value_inner::<T, T>(target, env, |toml, target| {
-            config(toml, target).map(|v| Cow::Owned(v))
-        })
+        env: impl Fn(&Environment, &Target) -> (Option<T>, Option<T>),
+        config: impl Fn(&CrossToml, &Target) -> (Option<T>, Option<T>),
+    ) -> Result<Option<T>> {
+        let (env_build, env_target) = env(&self.env, target);
+
+        if let Some(env_target) = env_target {
+            return Ok(Some(env_target));
+        }
+
+        let (build, target) = self
+            .toml
+            .as_ref()
+            .map(|t| config(t, target))
+            .unwrap_or_default();
+
+        // FIXME: let expression
+        if target.is_none() && env_build.is_some() {
+            return Ok(env_build);
+        }
+
+        if target.is_none() {
+            Ok(build)
+        } else {
+            Ok(target)
+        }
     }
 
     #[cfg(test)]
-    pub(crate) fn new_with(toml: Option<CrossToml>, env: Environment) -> Self {
+    fn new_with(toml: Option<CrossToml>, env: Environment) -> Self {
         Config { toml, env }
     }
 
     pub fn xargo(&self, target: &Target) -> Option<bool> {
-        self.get_from_value(target, Environment::xargo, CrossToml::xargo)
+        self.bool_from_config(target, Environment::xargo, CrossToml::xargo)
     }
 
-    pub fn build_std(&self, target: &Target) -> Option<BuildStd> {
-        self.get_from_ref(target, Environment::build_std, CrossToml::build_std)
+    pub fn build_std(&self, target: &Target) -> Option<bool> {
+        self.bool_from_config(target, Environment::build_std, CrossToml::build_std)
     }
 
     pub fn zig(&self, target: &Target) -> Option<bool> {
-        self.get_from_value(target, Environment::zig, CrossToml::zig)
+        self.bool_from_config(target, Environment::zig, CrossToml::zig)
     }
 
-    pub fn zig_version(&self, target: &Target) -> Option<String> {
+    pub fn zig_version(&self, target: &Target) -> Result<Option<String>> {
         self.get_from_value(target, Environment::zig_version, CrossToml::zig_version)
     }
 
     pub fn zig_image(&self, target: &Target) -> Result<Option<PossibleImage>> {
-        let env = self.env.zig_image(target)?;
-        Ok(self.get_from_value(target, |_, _| env, CrossToml::zig_image))
+        let (b, t) = self.env.zig_image(target)?;
+        self.get_from_value(target, |_, _| (b.clone(), t.clone()), CrossToml::zig_image)
     }
 
     pub fn image(&self, target: &Target) -> Result<Option<PossibleImage>> {
         let env = self.env.image(target)?;
-        Ok(self.get_from_ref(
+        self.get_from_ref(
             target,
-            |_, _| ConfVal::new(None, env),
-            |toml, target| ConfVal::new(None, toml.image(target)),
-        ))
+            move |_, _| (None, env.clone()),
+            |toml, target| (None, toml.image(target)),
+        )
     }
 
-    pub fn runner(&self, target: &Target) -> Option<String> {
+    pub fn runner(&self, target: &Target) -> Result<Option<String>> {
         self.get_from_ref(
             target,
-            |env, target| ConfVal::new(None, env.runner(target)),
-            |toml, target| ConfVal::new(None, toml.runner(target)),
+            |env, target| (None, env.runner(target)),
+            |toml, target| (None, toml.runner(target)),
         )
     }
 
@@ -410,7 +400,7 @@ impl Config {
         self.env.build_opts()
     }
 
-    pub fn env_passthrough(&self, target: &Target) -> Option<Vec<String>> {
+    pub fn env_passthrough(&self, target: &Target) -> Result<Option<Vec<String>>> {
         self.vec_from_config(
             target,
             Environment::passthrough,
@@ -419,7 +409,7 @@ impl Config {
         )
     }
 
-    pub fn env_volumes(&self, target: &Target) -> Option<Vec<String>> {
+    pub fn env_volumes(&self, target: &Target) -> Result<Option<Vec<String>>> {
         self.get_from_ref(target, Environment::volumes, CrossToml::env_volumes)
     }
 
@@ -432,11 +422,11 @@ impl Config {
             .and_then(|t| t.default_target(target_list))
     }
 
-    pub fn dockerfile(&self, target: &Target) -> Option<String> {
+    pub fn dockerfile(&self, target: &Target) -> Result<Option<String>> {
         self.get_from_ref(target, Environment::dockerfile, CrossToml::dockerfile)
     }
 
-    pub fn dockerfile_context(&self, target: &Target) -> Option<String> {
+    pub fn dockerfile_context(&self, target: &Target) -> Result<Option<String>> {
         self.get_from_ref(
             target,
             Environment::dockerfile_context,
@@ -444,40 +434,46 @@ impl Config {
         )
     }
 
-    pub fn dockerfile_build_args(&self, target: &Target) -> Option<HashMap<String, String>> {
+    pub fn dockerfile_build_args(
+        &self,
+        target: &Target,
+    ) -> Result<Option<HashMap<String, String>>> {
         // This value does not support env variables
         self.toml
             .as_ref()
-            .and_then(|t| t.dockerfile_build_args(target))
+            .map_or(Ok(None), |t| Ok(t.dockerfile_build_args(target)))
     }
 
-    pub fn pre_build(&self, target: &Target) -> Option<PreBuild> {
+    pub fn pre_build(&self, target: &Target) -> Result<Option<PreBuild>> {
         self.get_from_ref(target, Environment::pre_build, CrossToml::pre_build)
     }
 
     // FIXME: remove when we disable sums in 0.3.0.
     fn sum_of_env_toml_values<'a>(
         &'a self,
-        env_values: Option<Vec<String>>,
-        toml_getter: impl FnOnce(&'a CrossToml) -> ConfVal<&'a [String]>,
-    ) -> Option<Vec<String>> {
+        env_values: Option<impl AsRef<[String]>>,
+        toml_getter: impl FnOnce(&'a CrossToml) -> (Option<&'a [String]>, Option<&'a [String]>),
+    ) -> Result<Option<Vec<String>>> {
         let mut defined = false;
         let mut collect = vec![];
-        if env_values.is_some() {
-            return env_values;
-        } else if let Some(toml) = self.toml.as_ref().map(toml_getter) {
-            if let Some(build) = toml.build {
+        if let Some(vars) = env_values {
+            collect.extend(vars.as_ref().iter().cloned());
+            defined = true;
+        } else if let Some((build, target)) = self.toml.as_ref().map(toml_getter) {
+            if let Some(build) = build {
                 collect.extend(build.iter().cloned());
                 defined = true;
             }
-
-            if let Some(target) = toml.target {
+            if let Some(target) = target {
                 collect.extend(target.iter().cloned());
                 defined = true;
             }
         }
-
-        defined.then_some(collect)
+        if !defined {
+            Ok(None)
+        } else {
+            Ok(Some(collect))
+        }
     }
 }
 
@@ -523,6 +519,7 @@ mod tests {
     }
 
     mod test_environment {
+
         use super::*;
 
         #[test]
@@ -534,10 +531,7 @@ mod tests {
 
             let env = Environment::new(Some(map));
             assert_eq!(env.xargo(&target()), (Some(true), None));
-            assert_eq!(
-                env.build_std(&target()),
-                (Some(BuildStd::Bool(false)), None)
-            );
+            assert_eq!(env.build_std(&target()), (Some(false), None));
             assert_eq!(env.zig(&target()), (None, None));
             assert_eq!(env.zig_version(&target()), (None, None));
             assert_eq!(env.zig_image(&target())?, (Some("zig:local".into()), None));
@@ -588,7 +582,7 @@ mod tests {
 
             let env = Environment::new(Some(map));
 
-            let ConfVal { build, target } = env.passthrough(&target());
+            let (build, target) = env.passthrough(&target());
             assert!(build.as_ref().unwrap().contains(&"TEST1".to_owned()));
             assert!(build.as_ref().unwrap().contains(&"TEST2".to_owned()));
             assert!(target.as_ref().unwrap().contains(&"PASS1".to_owned()));
@@ -598,6 +592,7 @@ mod tests {
 
     #[cfg(test)]
     mod test_config {
+
         use super::*;
 
         macro_rules! s {
@@ -628,7 +623,7 @@ mod tests {
             assert_eq!(config.xargo(&target()), Some(true));
             assert_eq!(config.build_std(&target()), None);
             assert_eq!(
-                config.pre_build(&target()),
+                config.pre_build(&target())?,
                 Some(PreBuild::Lines(vec![
                     s!("apt-get update"),
                     s!("apt-get install zlib-dev")
@@ -642,16 +637,13 @@ mod tests {
         pub fn env_target_and_toml_target_xargo_target_then_use_env() -> Result<()> {
             let mut map = HashMap::new();
             map.insert("CROSS_TARGET_AARCH64_UNKNOWN_LINUX_GNU_XARGO", "true");
-            map.insert("CROSS_TARGET_AARCH64_UNKNOWN_LINUX_GNU_BUILD_STD", "core");
+            map.insert("CROSS_TARGET_AARCH64_UNKNOWN_LINUX_GNU_BUILD_STD", "true");
             let env = Environment::new(Some(map));
 
             let config = Config::new_with(Some(toml(TOML_TARGET_XARGO_FALSE)?), env);
             assert_eq!(config.xargo(&target()), Some(true));
-            assert_eq!(
-                config.build_std(&target()),
-                Some(BuildStd::Crates(vec!["core".to_owned()]))
-            );
-            assert_eq!(config.pre_build(&target()), None);
+            assert_eq!(config.build_std(&target()), Some(true));
+            assert_eq!(config.pre_build(&target())?, None);
 
             Ok(())
         }
@@ -665,7 +657,7 @@ mod tests {
             let config = Config::new_with(Some(toml(TOML_BUILD_XARGO_FALSE)?), env);
             assert_eq!(config.xargo(&target()), Some(true));
             assert_eq!(config.build_std(&target()), None);
-            assert_eq!(config.pre_build(&target()), None);
+            assert_eq!(config.pre_build(&target())?, None);
 
             Ok(())
         }
@@ -681,7 +673,7 @@ mod tests {
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_BUILD_PRE_BUILD)?), env);
             assert_eq!(
-                config.pre_build(&target()),
+                config.pre_build(&target())?,
                 Some(PreBuild::Single {
                     line: s!("dpkg --add-architecture arm64"),
                     env: true
@@ -702,14 +694,14 @@ mod tests {
 
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_BUILD_DOCKERFILE)?), env);
-            assert_eq!(config.dockerfile(&target()), Some(s!("Dockerfile4")));
-            assert_eq!(config.dockerfile(&target2()), Some(s!("Dockerfile3")));
+            assert_eq!(config.dockerfile(&target())?, Some(s!("Dockerfile4")));
+            assert_eq!(config.dockerfile(&target2())?, Some(s!("Dockerfile3")));
 
             let map = HashMap::new();
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_BUILD_DOCKERFILE)?), env);
-            assert_eq!(config.dockerfile(&target()), Some(s!("Dockerfile2")));
-            assert_eq!(config.dockerfile(&target2()), Some(s!("Dockerfile1")));
+            assert_eq!(config.dockerfile(&target())?, Some(s!("Dockerfile2")));
+            assert_eq!(config.dockerfile(&target2())?, Some(s!("Dockerfile1")));
 
             Ok(())
         }
@@ -720,11 +712,11 @@ mod tests {
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_ARRAYS_BOTH)?), env);
             assert_eq!(
-                config.env_passthrough(&target()),
+                config.env_passthrough(&target())?,
                 Some(vec![s!("VAR1"), s!("VAR2"), s!("VAR3"), s!("VAR4")])
             );
             assert_eq!(
-                config.env_volumes(&target()),
+                config.env_volumes(&target())?,
                 Some(vec![s!("VOLUME3"), s!("VOLUME4")])
             );
 
@@ -737,11 +729,11 @@ mod tests {
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_ARRAYS_BUILD)?), env);
             assert_eq!(
-                config.env_passthrough(&target()),
+                config.env_passthrough(&target())?,
                 Some(vec![s!("VAR1"), s!("VAR2")])
             );
             assert_eq!(
-                config.env_volumes(&target()),
+                config.env_volumes(&target())?,
                 Some(vec![s!("VOLUME1"), s!("VOLUME2")])
             );
 
@@ -754,11 +746,11 @@ mod tests {
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_ARRAYS_TARGET)?), env);
             assert_eq!(
-                config.env_passthrough(&target()),
+                config.env_passthrough(&target())?,
                 Some(vec![s!("VAR3"), s!("VAR4")])
             );
             assert_eq!(
-                config.env_volumes(&target()),
+                config.env_volumes(&target())?,
                 Some(vec![s!("VOLUME3"), s!("VOLUME4")])
             );
 
@@ -771,9 +763,9 @@ mod tests {
             map.insert("CROSS_BUILD_ENV_VOLUMES", "VOLUME1 VOLUME2");
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_BUILD_VOLUMES)?), env);
-            let expected = [s!("VOLUME1"), s!("VOLUME2")];
+            let expected = vec![s!("VOLUME1"), s!("VOLUME2")];
 
-            let result = config.env_volumes(&target()).unwrap_or_default();
+            let result = config.env_volumes(&target()).unwrap().unwrap_or_default();
             dbg!(&result);
             assert!(result.len() == 2);
             assert!(result.contains(&expected[0]));
@@ -787,9 +779,9 @@ mod tests {
             let map = HashMap::new();
             let env = Environment::new(Some(map));
             let config = Config::new_with(Some(toml(TOML_BUILD_VOLUMES)?), env);
-            let expected = [s!("VOLUME3"), s!("VOLUME4")];
+            let expected = vec![s!("VOLUME3"), s!("VOLUME4")];
 
-            let result = config.env_volumes(&target()).unwrap_or_default();
+            let result = config.env_volumes(&target()).unwrap().unwrap_or_default();
             dbg!(&result);
             assert!(result.len() == 2);
             assert!(result.contains(&expected[0]));
diff --git a/src/cross_toml.rs b/src/cross_toml.rs
index 40ae743..7965ca5 100644
--- a/src/cross_toml.rs
+++ b/src/cross_toml.rs
@@ -5,7 +5,6 @@
 //!
 //! [1]: https://github.com/cross-rs/cross/blob/main/docs/config_file.md
 
-use crate::config::ConfVal;
 use crate::docker::custom::PreBuild;
 use crate::docker::PossibleImage;
 use crate::shell::MessageInfo;
@@ -30,7 +29,7 @@ pub struct CrossBuildConfig {
     #[serde(default)]
     env: CrossEnvConfig,
     xargo: Option<bool>,
-    build_std: Option<BuildStd>,
+    build_std: Option<bool>,
     #[serde(default, deserialize_with = "opt_string_bool_or_struct")]
     zig: Option<CrossZigConfig>,
     default_target: Option<String>,
@@ -45,7 +44,7 @@ pub struct CrossBuildConfig {
 #[serde(rename_all = "kebab-case")]
 pub struct CrossTargetConfig {
     xargo: Option<bool>,
-    build_std: Option<BuildStd>,
+    build_std: Option<bool>,
     #[serde(default, deserialize_with = "opt_string_bool_or_struct")]
     zig: Option<CrossZigConfig>,
     #[serde(default, deserialize_with = "opt_string_or_struct")]
@@ -59,28 +58,6 @@ pub struct CrossTargetConfig {
     env: CrossEnvConfig,
 }
 
-#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
-#[serde(untagged, rename_all = "kebab-case")]
-pub enum BuildStd {
-    Bool(bool),
-    Crates(Vec<String>),
-}
-
-impl Default for BuildStd {
-    fn default() -> Self {
-        Self::Bool(false)
-    }
-}
-
-impl BuildStd {
-    pub fn enabled(&self) -> bool {
-        match self {
-            Self::Bool(enabled) => *enabled,
-            Self::Crates(arr) => !arr.is_empty(),
-        }
-    }
-}
-
 /// Dockerfile configuration
 #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
 #[serde(rename_all = "kebab-case")]
@@ -280,7 +257,7 @@ impl CrossToml {
     }
 
     /// Returns the `{}.dockerfile` or `{}.dockerfile.file` part of `Cross.toml`
-    pub fn dockerfile(&self, target: &Target) -> ConfVal<&String> {
+    pub fn dockerfile(&self, target: &Target) -> (Option<&String>, Option<&String>) {
         self.get_ref(
             target,
             |b| b.dockerfile.as_ref().map(|c| &c.file),
@@ -289,7 +266,7 @@ impl CrossToml {
     }
 
     /// Returns the `target.{}.dockerfile.context` part of `Cross.toml`
-    pub fn dockerfile_context(&self, target: &Target) -> ConfVal<&String> {
+    pub fn dockerfile_context(&self, target: &Target) -> (Option<&String>, Option<&String>) {
         self.get_ref(
             target,
             |b| b.dockerfile.as_ref().and_then(|c| c.context.as_ref()),
@@ -314,7 +291,7 @@ impl CrossToml {
     }
 
     /// Returns the `build.dockerfile.pre-build` and `target.{}.dockerfile.pre-build` part of `Cross.toml`
-    pub fn pre_build(&self, target: &Target) -> ConfVal<&PreBuild> {
+    pub fn pre_build(&self, target: &Target) -> (Option<&PreBuild>, Option<&PreBuild>) {
         self.get_ref(target, |b| b.pre_build.as_ref(), |t| t.pre_build.as_ref())
     }
 
@@ -324,17 +301,17 @@ impl CrossToml {
     }
 
     /// Returns the `build.xargo` or the `target.{}.xargo` part of `Cross.toml`
-    pub fn xargo(&self, target: &Target) -> ConfVal<bool> {
+    pub fn xargo(&self, target: &Target) -> (Option<bool>, Option<bool>) {
         self.get_value(target, |b| b.xargo, |t| t.xargo)
     }
 
     /// Returns the `build.build-std` or the `target.{}.build-std` part of `Cross.toml`
-    pub fn build_std(&self, target: &Target) -> ConfVal<&BuildStd> {
-        self.get_ref(target, |b| b.build_std.as_ref(), |t| t.build_std.as_ref())
+    pub fn build_std(&self, target: &Target) -> (Option<bool>, Option<bool>) {
+        self.get_value(target, |b| b.build_std, |t| t.build_std)
     }
 
     /// Returns the `{}.zig` or `{}.zig.version` part of `Cross.toml`
-    pub fn zig(&self, target: &Target) -> ConfVal<bool> {
+    pub fn zig(&self, target: &Target) -> (Option<bool>, Option<bool>) {
         self.get_value(
             target,
             |b| b.zig.as_ref().and_then(|z| z.enable),
@@ -343,7 +320,7 @@ impl CrossToml {
     }
 
     /// Returns the `{}.zig` or `{}.zig.version` part of `Cross.toml`
-    pub fn zig_version(&self, target: &Target) -> ConfVal<String> {
+    pub fn zig_version(&self, target: &Target) -> (Option<String>, Option<String>) {
         self.get_value(
             target,
             |b| b.zig.as_ref().and_then(|c| c.version.clone()),
@@ -352,7 +329,7 @@ impl CrossToml {
     }
 
     /// Returns the  `{}.zig.image` part of `Cross.toml`
-    pub fn zig_image(&self, target: &Target) -> ConfVal<PossibleImage> {
+    pub fn zig_image(&self, target: &Target) -> (Option<PossibleImage>, Option<PossibleImage>) {
         self.get_value(
             target,
             |b| b.zig.as_ref().and_then(|c| c.image.clone()),
@@ -361,7 +338,7 @@ impl CrossToml {
     }
 
     /// Returns the list of environment variables to pass through for `build` and `target`
-    pub fn env_passthrough(&self, target: &Target) -> ConfVal<&[String]> {
+    pub fn env_passthrough(&self, target: &Target) -> (Option<&[String]>, Option<&[String]>) {
         self.get_ref(
             target,
             |build| build.env.passthrough.as_deref(),
@@ -370,7 +347,7 @@ impl CrossToml {
     }
 
     /// Returns the list of environment variables to pass through for `build` and `target`
-    pub fn env_volumes(&self, target: &Target) -> ConfVal<&[String]> {
+    pub fn env_volumes(&self, target: &Target) -> (Option<&[String]>, Option<&[String]>) {
         self.get_ref(
             target,
             |build| build.env.volumes.as_deref(),
@@ -396,10 +373,10 @@ impl CrossToml {
         target_triple: &Target,
         get_build: impl Fn(&CrossBuildConfig) -> Option<T>,
         get_target: impl Fn(&CrossTargetConfig) -> Option<T>,
-    ) -> ConfVal<T> {
+    ) -> (Option<T>, Option<T>) {
         let build = get_build(&self.build);
         let target = self.get_target(target_triple).and_then(get_target);
-        ConfVal::new(build, target)
+        (build, target)
     }
 
     fn get_ref<T: ?Sized>(
@@ -407,10 +384,10 @@ impl CrossToml {
         target_triple: &Target,
         get_build: impl Fn(&CrossBuildConfig) -> Option<&T>,
         get_target: impl Fn(&CrossTargetConfig) -> Option<&T>,
-    ) -> ConfVal<&T> {
+    ) -> (Option<&T>, Option<&T>) {
         let build = get_build(&self.build);
         let target = self.get_target(target_triple).and_then(get_target);
-        ConfVal::new(build, target)
+        (build, target)
     }
 }
 
@@ -591,7 +568,7 @@ where
 
 #[cfg(test)]
 mod tests {
-    use crate::docker::{ImagePlatform, ImageReference};
+    use crate::docker::ImagePlatform;
 
     use super::*;
     use crate::shell;
@@ -670,7 +647,7 @@ mod tests {
                     volumes: Some(vec![p!("VOL1_ARG"), p!("VOL2_ARG")]),
                 },
                 xargo: Some(false),
-                build_std: Some(BuildStd::Bool(true)),
+                build_std: Some(true),
                 zig: None,
                 image: Some("test-image".into()),
                 runner: None,
@@ -741,7 +718,7 @@ mod tests {
                 build_std: None,
                 zig: None,
                 image: Some(PossibleImage {
-                    reference: ImageReference::Name("test-image".to_owned()),
+                    name: "test-image".to_owned(),
                     toolchain: vec![ImagePlatform::from_target(
                         "aarch64-unknown-linux-musl".into(),
                     )?],
@@ -773,7 +750,7 @@ mod tests {
                     enable: None,
                     version: None,
                     image: Some(PossibleImage {
-                        reference: ImageReference::Name("zig:local".to_owned()),
+                        name: "zig:local".to_owned(),
                         toolchain: vec![ImagePlatform::from_target(
                             "aarch64-unknown-linux-gnu".into(),
                         )?],
@@ -939,14 +916,14 @@ mod tests {
             [target.target3]
             xargo = false
             build-std = true
-            image = "@sha256:test-image3"
+            image = "test-image3"
 
             [target.target3.env]
             volumes = ["VOL3_ARG"]
             passthrough = ["VAR3"]
 
             [build]
-            build-std = ["core", "alloc"]
+            build-std = true
             xargo = false
             default-target = "aarch64-unknown-linux-gnu"
 
@@ -978,14 +955,14 @@ mod tests {
             [target.target3]
             xargo = false
             build-std = true
-            image = "@sha256:test-image3"
+            image = "test-image3"
 
             [target.target3.env]
             volumes = ["VOL3_ARG"]
             passthrough = ["VAR3"]
 
             [build]
-            build-std = ["core", "alloc"]
+            build-std = true
             xargo = false
             default-target = "aarch64-unknown-linux-gnu"
 
@@ -1006,13 +983,7 @@ mod tests {
         // need to test individual values. i've broken this down into
         // tests on values for better error reporting
         let build = &cfg_expected.build;
-        assert_eq!(
-            build.build_std,
-            Some(BuildStd::Crates(vec![
-                "core".to_owned(),
-                "alloc".to_owned()
-            ]))
-        );
+        assert_eq!(build.build_std, Some(true));
         assert_eq!(build.xargo, Some(false));
         assert_eq!(build.default_target, Some(p!("aarch64-unknown-linux-gnu")));
         assert_eq!(build.pre_build, None);
@@ -1022,7 +993,7 @@ mod tests {
 
         let targets = &cfg_expected.targets;
         let aarch64 = &targets[&Target::new_built_in("aarch64-unknown-linux-gnu")];
-        assert_eq!(aarch64.build_std, Some(BuildStd::Bool(true)));
+        assert_eq!(aarch64.build_std, Some(true));
         assert_eq!(aarch64.xargo, Some(false));
         assert_eq!(aarch64.image, Some(p!("test-image1")));
         assert_eq!(aarch64.pre_build, None);
@@ -1031,7 +1002,7 @@ mod tests {
         assert_eq!(aarch64.env.volumes, Some(vec![p!("VOL1_ARG")]));
 
         let target2 = &targets[&Target::new_custom("target2")];
-        assert_eq!(target2.build_std, Some(BuildStd::Bool(false)));
+        assert_eq!(target2.build_std, Some(false));
         assert_eq!(target2.xargo, Some(false));
         assert_eq!(target2.image, Some(p!("test-image2-precedence")));
         assert_eq!(target2.pre_build, None);
@@ -1040,9 +1011,9 @@ mod tests {
         assert_eq!(target2.env.volumes, Some(vec![p!("VOL2_ARG_PRECEDENCE")]));
 
         let target3 = &targets[&Target::new_custom("target3")];
-        assert_eq!(target3.build_std, Some(BuildStd::Bool(true)));
+        assert_eq!(target3.build_std, Some(true));
         assert_eq!(target3.xargo, Some(false));
-        assert_eq!(target3.image, Some(p!("@sha256:test-image3")));
+        assert_eq!(target3.image, Some(p!("test-image3")));
         assert_eq!(target3.pre_build, None);
         assert_eq!(target3.dockerfile, None);
         assert_eq!(target3.env.passthrough, Some(vec![p!("VAR3")]));
@@ -1064,10 +1035,7 @@ mod tests {
         assert!(unused.is_empty());
         assert!(matches!(
             toml.pre_build(&Target::new_built_in("aarch64-unknown-linux-gnu")),
-            ConfVal {
-                build: Some(&PreBuild::Lines(_)),
-                target: Some(&PreBuild::Single { .. }),
-            },
+            (Some(&PreBuild::Lines(_)), Some(&PreBuild::Single { .. }))
         ));
         Ok(())
     }
diff --git a/src/docker/image.rs b/src/docker/image.rs
index 3d3c15b..6f45b5d 100644
--- a/src/docker/image.rs
+++ b/src/docker/image.rs
@@ -2,12 +2,7 @@ use std::str::FromStr;
 
 use serde::{Deserialize, Serialize};
 
-use crate::{
-    docker::{CROSS_IMAGE, DEFAULT_IMAGE_VERSION},
-    errors::*,
-    shell::MessageInfo,
-    TargetTriple,
-};
+use crate::{errors::*, shell::MessageInfo, TargetTriple};
 
 use super::Engine;
 
@@ -26,23 +21,18 @@ impl std::fmt::Display for Image {
 
 #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
 pub struct PossibleImage {
-    #[serde(rename = "name")]
-    pub reference: ImageReference,
+    pub name: String,
     // The toolchain triple the image is built for
     pub toolchain: Vec<ImagePlatform>,
 }
 
 impl PossibleImage {
-    pub fn to_definite_with(&self, engine: &Engine, msg_info: &mut MessageInfo) -> Result<Image> {
-        let ImageReference::Name(name) = self.reference.clone() else {
-            eyre::bail!("cannot make definite Image from unqualified PossibleImage");
-        };
-
+    pub fn to_definite_with(&self, engine: &Engine, msg_info: &mut MessageInfo) -> Image {
         if self.toolchain.is_empty() {
-            Ok(Image {
-                name,
+            Image {
+                name: self.name.clone(),
                 platform: ImagePlatform::DEFAULT,
-            })
+            }
         } else {
             let platform = if self.toolchain.len() == 1 {
                 self.toolchain.first().expect("should contain at least one")
@@ -81,10 +71,10 @@ impl PossibleImage {
                     platform
                 }
             };
-            Ok(Image {
+            Image {
                 platform: platform.clone(),
-                name,
-            })
+                name: self.name.clone(),
+            }
         }
     }
 }
@@ -92,7 +82,7 @@ impl PossibleImage {
 impl<T: AsRef<str>> From<T> for PossibleImage {
     fn from(s: T) -> Self {
         PossibleImage {
-            reference: s.as_ref().to_owned().into(),
+            name: s.as_ref().to_owned(),
             toolchain: vec![],
         }
     }
@@ -108,57 +98,9 @@ impl FromStr for PossibleImage {
 
 impl std::fmt::Display for PossibleImage {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        f.write_str(self.reference.get())
-    }
-}
-
-#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
-#[serde(from = "String", untagged)]
-pub enum ImageReference {
-    /// Partially qualified reference, with or without tag/digest
-    Name(String),
-    /// Unqualified reference, only a tag or digest
-    Identifier(String),
-    /// Unqualified reference, only a subtarget
-    Subtarget(String),
-}
-
-impl ImageReference {
-    pub fn get(&self) -> &str {
-        match self {
-            Self::Name(s) => s,
-            Self::Identifier(s) => s,
-            Self::Subtarget(s) => s,
-        }
-    }
-
-    pub fn ensure_qualified(&mut self, target_name: &str) {
-        let image_name = match self {
-            Self::Name(_) => return,
-            Self::Identifier(id) => {
-                format!("{CROSS_IMAGE}/{target_name}{id}")
-            }
-            Self::Subtarget(sub) => {
-                format!("{CROSS_IMAGE}/{target_name}:{DEFAULT_IMAGE_VERSION}{sub}")
-            }
-        };
-
-        *self = Self::Name(image_name);
-    }
-}
-
-impl From<String> for ImageReference {
-    fn from(s: String) -> Self {
-        if s.starts_with('-') {
-            Self::Subtarget(s)
-        } else if s.starts_with(':') || s.starts_with('@') {
-            Self::Identifier(s)
-        } else {
-            Self::Name(s)
-        }
+        f.write_str(&self.name)
     }
 }
-
 /// The architecture/platform to use in the image
 ///
 /// <https://github.com/containerd/containerd/blob/release/1.6/platforms/platforms.go#L63>
diff --git a/src/docker/local.rs b/src/docker/local.rs
index f7d0507..e4f634d 100644
--- a/src/docker/local.rs
+++ b/src/docker/local.rs
@@ -95,25 +95,20 @@ pub(crate) fn run(
         // Prevent `bin` from being mounted inside the Docker container.
         .args(["-v", &format!("{}/bin", toolchain_dirs.cargo_mount_path())]);
 
-    let host_root = paths.mount_finder.find_mount_path(package_dirs.host_root());
     docker.args([
         "-v",
         &format!(
             "{}:{}{selinux}",
-            host_root.to_utf8()?,
+            package_dirs.host_root().to_utf8()?,
             package_dirs.mount_root()
         ),
     ]);
-
-    let sysroot = paths
-        .mount_finder
-        .find_mount_path(toolchain_dirs.get_sysroot());
     docker
         .args([
             "-v",
             &format!(
                 "{}:{}{selinux_ro}",
-                sysroot.to_utf8()?,
+                toolchain_dirs.get_sysroot().to_utf8()?,
                 toolchain_dirs.sysroot_mount_path()
             ),
         ])
diff --git a/src/docker/mod.rs b/src/docker/mod.rs
index def8169..f61798a 100644
--- a/src/docker/mod.rs
+++ b/src/docker/mod.rs
@@ -12,9 +12,7 @@ pub use self::engine::*;
 pub use self::provided_images::PROVIDED_IMAGES;
 pub use self::shared::*;
 
-pub use image::{
-    Architecture, Image, ImagePlatform, ImageReference, Os as ContainerOs, PossibleImage,
-};
+pub use image::{Architecture, Image, ImagePlatform, Os as ContainerOs, PossibleImage};
 
 use std::process::ExitStatus;
 
@@ -33,10 +31,6 @@ impl ProvidedImage {
     pub fn image_name(&self, repository: &str, tag: &str) -> String {
         image_name(self.name, self.sub, repository, tag)
     }
-
-    pub fn default_image_name(&self) -> String {
-        self.image_name(CROSS_IMAGE, DEFAULT_IMAGE_VERSION)
-    }
 }
 
 pub fn image_name(target: &str, sub: Option<&str>, repository: &str, tag: &str) -> String {
diff --git a/src/docker/provided_images.rs b/src/docker/provided_images.rs
index be7f087..6d87ec7 100644
--- a/src/docker/provided_images.rs
+++ b/src/docker/provided_images.rs
@@ -228,16 +228,6 @@ pub static PROVIDED_IMAGES: &[ProvidedImage] = &[
             platforms: &[ImagePlatform::X86_64_UNKNOWN_LINUX_GNU],
             sub: None
         },
-        ProvidedImage {
-            name: "sparcv9-sun-solaris",
-            platforms: &[ImagePlatform::X86_64_UNKNOWN_LINUX_GNU],
-            sub: None
-        },
-        ProvidedImage {
-            name: "x86_64-pc-solaris",
-            platforms: &[ImagePlatform::X86_64_UNKNOWN_LINUX_GNU],
-            sub: None
-        },
         ProvidedImage {
             name: "x86_64-unknown-illumos",
             platforms: &[ImagePlatform::X86_64_UNKNOWN_LINUX_GNU],
diff --git a/src/docker/shared.rs b/src/docker/shared.rs
index 7996e1f..db9156f 100644
--- a/src/docker/shared.rs
+++ b/src/docker/shared.rs
@@ -5,10 +5,10 @@ use std::sync::atomic::{AtomicBool, Ordering};
 use std::{env, fs, time};
 
 use super::custom::{Dockerfile, PreBuild};
+use super::engine::*;
 use super::image::PossibleImage;
 use super::Image;
 use super::PROVIDED_IMAGES;
-use super::{engine::*, ProvidedImage};
 use crate::cargo::CargoMetadata;
 use crate::config::Config;
 use crate::errors::*;
@@ -26,11 +26,6 @@ pub use super::custom::CROSS_CUSTOM_DOCKERFILE_IMAGE_PREFIX;
 pub const CROSS_IMAGE: &str = "ghcr.io/cross-rs";
 // note: this is the most common base image for our images
 pub const UBUNTU_BASE: &str = "ubuntu:20.04";
-pub const DEFAULT_IMAGE_VERSION: &str = if crate::commit_info().is_empty() {
-    env!("CARGO_PKG_VERSION")
-} else {
-    "main"
-};
 
 #[derive(Debug)]
 pub struct DockerOptions {
@@ -77,8 +72,15 @@ impl DockerOptions {
 
     #[must_use]
     pub fn needs_custom_image(&self) -> bool {
-        self.config.dockerfile(&self.target).is_some()
-            || self.config.pre_build(&self.target).is_some()
+        self.config
+            .dockerfile(&self.target)
+            .unwrap_or_default()
+            .is_some()
+            || self
+                .config
+                .pre_build(&self.target)
+                .unwrap_or_default()
+                .is_some()
     }
 
     pub(crate) fn custom_image_build(
@@ -91,8 +93,8 @@ impl DockerOptions {
             msg_info.note("cannot install armhf system packages via apt for `arm-unknown-linux-gnueabihf`, since they are for ARMv7a targets but this target is ARMv6. installation of all packages for the armhf architecture has been blocked.")?;
         }
 
-        if let Some(path) = self.config.dockerfile(&self.target) {
-            let context = self.config.dockerfile_context(&self.target);
+        if let Some(path) = self.config.dockerfile(&self.target)? {
+            let context = self.config.dockerfile_context(&self.target)?;
 
             let is_custom_image = self.config.image(&self.target)?.is_some();
 
@@ -112,13 +114,13 @@ impl DockerOptions {
                     self,
                     paths,
                     self.config
-                        .dockerfile_build_args(&self.target)
+                        .dockerfile_build_args(&self.target)?
                         .unwrap_or_default(),
                     msg_info,
                 )
                 .wrap_err("when building dockerfile")?;
         }
-        let pre_build = self.config.pre_build(&self.target);
+        let pre_build = self.config.pre_build(&self.target)?;
 
         if let Some(pre_build) = pre_build {
             match pre_build {
@@ -261,7 +263,7 @@ pub struct ToolchainDirectories {
 }
 
 impl ToolchainDirectories {
-    pub fn assemble(mount_finder: &MountFinder, toolchain: QualifiedToolchain) -> Result<Self> {
+    pub fn assemble(mount_finder: &MountFinder, mut toolchain: QualifiedToolchain) -> Result<Self> {
         let home_dir =
             home::home_dir().ok_or_else(|| eyre::eyre!("could not find home directory"))?;
         let cargo = home::cargo_home()?;
@@ -309,6 +311,8 @@ impl ToolchainDirectories {
         let cargo = mount_finder.find_mount_path(cargo);
         let xargo = mount_finder.find_mount_path(xargo);
 
+        toolchain.set_sysroot(|p| mount_finder.find_mount_path(p));
+
         // canonicalize these once to avoid syscalls
         let sysroot_mount_path = toolchain.get_sysroot().as_posix_absolute()?;
 
@@ -409,29 +413,30 @@ pub struct PackageDirectories {
 impl PackageDirectories {
     pub fn assemble(
         mount_finder: &MountFinder,
-        metadata: CargoMetadata,
+        mut metadata: CargoMetadata,
         cwd: &Path,
     ) -> Result<(Self, CargoMetadata)> {
         let target = &metadata.target_directory;
         // see ToolchainDirectories::assemble for creating directories
         create_target_dir(target)?;
 
+        metadata.target_directory = mount_finder.find_mount_path(target);
+
         // root is either workspace_root, or, if we're outside the workspace root, the current directory
-        let host_root = if metadata.workspace_root.starts_with(cwd) {
+        let host_root = mount_finder.find_mount_path(if metadata.workspace_root.starts_with(cwd) {
             cwd
         } else {
             &metadata.workspace_root
-        }
-        .to_path_buf();
+        });
 
         // on Windows, we can not mount the directory name directly. Instead, we use wslpath to convert the path to a linux compatible path.
         // NOTE: on unix, host root has already found the mount path
         let mount_root = host_root.as_posix_absolute()?;
-        let mount_cwd = cwd.as_posix_absolute()?;
+        let mount_cwd = mount_finder.find_path(cwd, false)?;
 
         Ok((
             PackageDirectories {
-                target: mount_finder.find_mount_path(target),
+                target: metadata.target_directory.clone(),
                 host_root,
                 mount_root,
                 mount_cwd,
@@ -909,7 +914,7 @@ fn validate_env_var<'a>(
         && !*warned
         && !var
             .chars()
-            .all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '_' | '0'..='9'))
+            .all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '_' ))
     {
         msg_info.warn(format_args!(
             "got {var_type} of \"{var}\" which is not a valid environment variable name. the proper syntax is {var_syntax}"
@@ -1012,7 +1017,7 @@ impl DockerCommandExt for Command {
         let mut warned = false;
         for ref var in options
             .config
-            .env_passthrough(&options.target)
+            .env_passthrough(&options.target)?
             .unwrap_or_default()
         {
             validate_env_var(
@@ -1028,7 +1033,7 @@ impl DockerCommandExt for Command {
             self.args(["-e", var]);
         }
 
-        let runner = options.config.runner(&options.target);
+        let runner = options.config.runner(&options.target)?;
         let cross_runner = format!("CROSS_RUNNER={}", runner.unwrap_or_default());
         self.args(["-e", &format!("XARGO_HOME={}", dirs.xargo_mount_path())])
             .args(["-e", &format!("CARGO_HOME={}", dirs.cargo_mount_path())])
@@ -1162,7 +1167,7 @@ impl DockerCommandExt for Command {
         let mut warned = false;
         for ref var in options
             .config
-            .env_volumes(&options.target)
+            .env_volumes(&options.target)?
             .unwrap_or_default()
         {
             let (var, value) = validate_env_var(
@@ -1188,7 +1193,10 @@ impl DockerCommandExt for Command {
             if let Ok(val) = value {
                 let canonical_path = file::canonicalize(&val)?;
                 let host_path = paths.mount_finder.find_path(&canonical_path, true)?;
-                let mount_path = Path::new(&val).as_posix_absolute()?;
+                let absolute_path = Path::new(&val).as_posix_absolute()?;
+                let mount_path = paths
+                    .mount_finder
+                    .find_path(Path::new(&absolute_path), true)?;
                 mount_cb(self, host_path.as_ref(), mount_path.as_ref())?;
                 self.args(["-e", &format!("{}={}", var, mount_path)]);
                 store_cb((val, mount_path));
@@ -1201,7 +1209,10 @@ impl DockerCommandExt for Command {
             // to the mounted project directory.
             let canonical_path = file::canonicalize(path)?;
             let host_path = paths.mount_finder.find_path(&canonical_path, true)?;
-            let mount_path = path.as_posix_absolute()?;
+            let absolute_path = Path::new(path).as_posix_absolute()?;
+            let mount_path = paths
+                .mount_finder
+                .find_path(Path::new(&absolute_path), true)?;
             mount_cb(self, host_path.as_ref(), mount_path.as_ref())?;
             store_cb((path.to_utf8()?.to_owned(), mount_path));
         }
@@ -1233,37 +1244,23 @@ pub enum GetImageError {
     Other(eyre::Report),
 }
 
-fn get_target_name(target: &Target, uses_zig: bool) -> &str {
-    if uses_zig {
-        "zig"
-    } else {
-        target.triple()
-    }
-}
-
-fn get_user_image(
+/// Simpler version of [get_image]
+pub fn get_image_name(
     config: &Config,
     target: &Target,
     uses_zig: bool,
-) -> Result<Option<PossibleImage>, GetImageError> {
-    let mut image = if uses_zig {
-        config.zig_image(target)
-    } else {
-        config.image(target)
-    }
-    .map_err(GetImageError::Other)?;
-
-    if let Some(image) = &mut image {
-        let target_name = get_target_name(target, uses_zig);
-        image.reference.ensure_qualified(target_name);
+) -> Result<String, GetImageError> {
+    if let Some(image) = config.image(target).map_err(GetImageError::Other)? {
+        return Ok(image.name);
     }
 
-    Ok(image)
-}
-
-fn get_provided_images_for_target(
-    target_name: &str,
-) -> Result<Vec<&'static ProvidedImage>, GetImageError> {
+    let target_name = match uses_zig {
+        true => match config.zig_image(target).map_err(GetImageError::Other)? {
+            Some(image) => return Ok(image.name),
+            None => "zig",
+        },
+        false => target.triple(),
+    };
     let compatible = PROVIDED_IMAGES
         .iter()
         .filter(|p| p.name == target_name)
@@ -1273,25 +1270,16 @@ fn get_provided_images_for_target(
         return Err(GetImageError::NoCompatibleImages(target_name.to_owned()));
     }
 
-    Ok(compatible)
-}
-
-/// Simpler version of [get_image]
-pub fn get_image_name(
-    config: &Config,
-    target: &Target,
-    uses_zig: bool,
-) -> Result<String, GetImageError> {
-    if let Some(image) = get_user_image(config, target, uses_zig)? {
-        return Ok(image.reference.get().to_owned());
-    }
+    let version = if crate::commit_info().is_empty() {
+        env!("CARGO_PKG_VERSION")
+    } else {
+        "main"
+    };
 
-    let target_name = get_target_name(target, uses_zig);
-    let compatible = get_provided_images_for_target(target_name)?;
     Ok(compatible
         .first()
         .expect("should not be empty")
-        .default_image_name())
+        .image_name(CROSS_IMAGE, version))
 }
 
 pub fn get_image(
@@ -1299,15 +1287,35 @@ pub fn get_image(
     target: &Target,
     uses_zig: bool,
 ) -> Result<PossibleImage, GetImageError> {
-    if let Some(image) = get_user_image(config, target, uses_zig)? {
+    if let Some(image) = config.image(target).map_err(GetImageError::Other)? {
         return Ok(image);
     }
 
-    let target_name = get_target_name(target, uses_zig);
-    let compatible = get_provided_images_for_target(target_name)?;
-    let pick = if let [first] = compatible[..] {
+    let target_name = match uses_zig {
+        true => match config.zig_image(target).map_err(GetImageError::Other)? {
+            Some(image) => return Ok(image),
+            None => "zig",
+        },
+        false => target.triple(),
+    };
+    let compatible = PROVIDED_IMAGES
+        .iter()
+        .filter(|p| p.name == target_name)
+        .collect::<Vec<_>>();
+
+    if compatible.is_empty() {
+        return Err(GetImageError::NoCompatibleImages(target_name.to_owned()));
+    }
+
+    let version = if crate::commit_info().is_empty() {
+        env!("CARGO_PKG_VERSION")
+    } else {
+        "main"
+    };
+
+    let pick = if compatible.len() == 1 {
         // If only one match, use that
-        first
+        compatible.first().expect("should not be empty")
     } else if compatible
         .iter()
         .filter(|provided| provided.sub.is_none())
@@ -1331,7 +1339,10 @@ pub fn get_image(
                     "candidates: {}",
                     compatible
                         .iter()
-                        .map(|provided| format!("\"{}\"", provided.default_image_name()))
+                        .map(|provided| format!(
+                            "\"{}\"",
+                            provided.image_name(CROSS_IMAGE, version)
+                        ))
                         .collect::<Vec<_>>()
                         .join(", ")
                 )
@@ -1339,86 +1350,29 @@ pub fn get_image(
         ));
     };
 
-    let image_name = pick.default_image_name();
+    let mut image: PossibleImage = pick.image_name(CROSS_IMAGE, version).into();
+
     if pick.platforms.is_empty() {
-        return Err(GetImageError::SpecifiedImageNoPlatform(image_name));
-    }
+        return Err(GetImageError::SpecifiedImageNoPlatform(image.to_string()));
+    };
 
-    let mut image: PossibleImage = image_name.into();
     image.toolchain = pick.platforms.to_vec();
     Ok(image)
 }
 
-fn docker_inspect_self_mountinfo(engine: &Engine, msg_info: &mut MessageInfo) -> Result<String> {
-    if cfg!(not(target_os = "linux")) {
-        eyre::bail!("/proc/self/mountinfo is unavailable when target_os != linux");
-    }
-
-    // The ID for the current Docker container might be in mountinfo,
-    // somewhere in a mount root. Full IDs are 64-char hexadecimal
-    // strings, so the first matching path segment in a mount root
-    // containing /docker/ is likely to be what we're looking for. See:
-    // https://www.kernel.org/doc/Documentation/filesystems/proc.txt
-    // https://community.toradex.com/t/15240/4
-    let mountinfo = file::read("/proc/self/mountinfo")?;
-    let container_id = mountinfo
-        .lines()
-        .filter_map(|s| s.split(' ').nth(3))
-        .filter(|s| s.contains("/docker/"))
-        .flat_map(|s| s.split('/'))
-        .find(|s| s.len() == 64 && s.as_bytes().iter().all(u8::is_ascii_hexdigit))
-        .ok_or_else(|| eyre::eyre!("couldn't find container id in mountinfo"))?;
-
-    engine
-        .subcommand("inspect")
-        .arg(container_id)
-        .run_and_get_stdout(msg_info)
-}
-
-fn docker_inspect_self(engine: &Engine, msg_info: &mut MessageInfo) -> Result<String> {
-    // Try to find the container ID by looking at HOSTNAME, and fallback to
-    // parsing `/proc/self/mountinfo` if HOSTNAME is unset or if there's no
-    // container that matches it (necessary e.g. when the container uses
-    // `--network=host`, which is act's default, see issue #1321).
-    // If `docker inspect` fails with unexpected output, skip the fallback
-    // and fail instantly.
-    if let Ok(hostname) = env::var("HOSTNAME") {
-        let mut command = engine.subcommand("inspect");
-        command.arg(hostname);
-        let out = command.run_and_get_output(msg_info)?;
-
-        if out.status.success() {
-            Ok(out.stdout()?)
-        } else {
-            let val = serde_json::from_slice::<serde_json::Value>(&out.stdout);
-            if let Ok(val) = val {
-                if let Some(array) = val.as_array() {
-                    // `docker inspect` completed but returned an empty array, most
-                    // likely indicating that the hostname isn't a valid container ID.
-                    if array.is_empty() {
-                        msg_info.debug("docker inspect found no containers matching HOSTNAME, retrying using mountinfo")?;
-                        return docker_inspect_self_mountinfo(engine, msg_info);
-                    }
-                }
-            }
-
-            let report = command
-                .status_result(msg_info, out.status, Some(&out))
-                .expect_err("we know the command failed")
-                .to_section_report();
-            Err(report)
-        }
-    } else {
-        msg_info.debug("HOSTNAME environment variable is unset")?;
-        docker_inspect_self_mountinfo(engine, msg_info)
-    }
-}
-
 fn docker_read_mount_paths(
     engine: &Engine,
     msg_info: &mut MessageInfo,
 ) -> Result<Vec<MountDetail>> {
-    let output = docker_inspect_self(engine, msg_info)?;
+    let hostname = env::var("HOSTNAME").wrap_err("HOSTNAME environment variable not found")?;
+
+    let mut docker: Command = {
+        let mut command = engine.subcommand("inspect");
+        command.arg(hostname);
+        command
+    };
+
+    let output = docker.run_and_get_stdout(msg_info)?;
     let info = serde_json::from_str(&output).wrap_err("failed to parse docker inspect output")?;
     dockerinfo_parse_mounts(&info)
 }
@@ -1549,10 +1503,8 @@ pub fn path_hash(path: &Path, count: usize) -> Result<String> {
 
 #[cfg(test)]
 mod tests {
-    use std::collections::HashMap;
-
     use super::*;
-    use crate::{config::Environment, id};
+    use crate::id;
 
     #[cfg(not(target_os = "windows"))]
     use crate::file::PathExt;
@@ -1607,50 +1559,6 @@ mod tests {
         }
     }
 
-    #[test]
-    fn test_tag_only_image() -> Result<()> {
-        let target: Target = TargetTriple::X86_64UnknownLinuxGnu.into();
-        let test = |map, expected_ver: &str, expected_ver_zig: &str| -> Result<()> {
-            let env = Environment::new(Some(map));
-            let config = Config::new_with(None, env);
-            for (uses_zig, expected_ver) in [(false, expected_ver), (true, expected_ver_zig)] {
-                let expected_image_target = if uses_zig {
-                    "zig"
-                } else {
-                    "x86_64-unknown-linux-gnu"
-                };
-                let expected = format!("ghcr.io/cross-rs/{expected_image_target}{expected_ver}");
-
-                let image = get_image(&config, &target, uses_zig)?;
-                assert_eq!(image.reference.get(), expected);
-                let image_name = get_image_name(&config, &target, uses_zig)?;
-                assert_eq!(image_name, expected);
-            }
-            Ok(())
-        };
-
-        let default_ver = format!(":{DEFAULT_IMAGE_VERSION}");
-        let mut map = HashMap::new();
-        test(map.clone(), &default_ver, &default_ver)?;
-
-        map.insert("CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_IMAGE", "-centos");
-        test(map.clone(), &format!("{default_ver}-centos"), &default_ver)?;
-
-        map.insert("CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_IMAGE", ":edge");
-        test(map.clone(), ":edge", &default_ver)?;
-
-        map.insert(
-            "CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_ZIG_IMAGE",
-            "@sha256:foobar",
-        );
-        test(map.clone(), ":edge", "@sha256:foobar")?;
-
-        map.remove("CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_IMAGE");
-        test(map.clone(), &default_ver, "@sha256:foobar")?;
-
-        Ok(())
-    }
-
     mod directories {
         use super::*;
         use crate::cargo::cargo_metadata_with_args;
@@ -1775,8 +1683,9 @@ mod tests {
 
             let mut msg_info = MessageInfo::default();
             let engine = create_engine(&mut msg_info);
-            if engine.is_err() {
-                eprintln!("could not get container engine");
+            let hostname = env::var("HOSTNAME");
+            if engine.is_err() || hostname.is_err() {
+                eprintln!("could not get container engine or no hostname found");
                 reset_env(vars);
                 return Ok(());
             }
@@ -1786,8 +1695,12 @@ mod tests {
                 reset_env(vars);
                 return Ok(());
             }
-            let output = docker_inspect_self(&engine, &mut msg_info);
-            if output.is_err() {
+            let hostname = hostname.unwrap();
+            let output = engine
+                .subcommand("inspect")
+                .arg(hostname)
+                .run_and_get_output(&mut msg_info)?;
+            if !output.status.success() {
                 eprintln!("inspect failed");
                 reset_env(vars);
                 return Ok(());
@@ -1803,9 +1716,15 @@ mod tests {
 
             paths_equal(toolchain_dirs.cargo(), &mount_path(home()?.join(".cargo")))?;
             paths_equal(toolchain_dirs.xargo(), &mount_path(home()?.join(".xargo")))?;
-            paths_equal(package_dirs.host_root(), &get_cwd()?)?;
-            assert_eq!(package_dirs.mount_root(), &get_cwd()?.as_posix_absolute()?);
-            assert_eq!(package_dirs.mount_cwd(), &get_cwd()?.as_posix_absolute()?);
+            paths_equal(package_dirs.host_root(), &mount_path(get_cwd()?))?;
+            assert_eq!(
+                package_dirs.mount_root(),
+                &mount_path(get_cwd()?).as_posix_absolute()?
+            );
+            assert_eq!(
+                package_dirs.mount_cwd(),
+                &mount_path(get_cwd()?).as_posix_absolute()?
+            );
 
             reset_env(vars);
             Ok(())
diff --git a/src/lib.rs b/src/lib.rs
index 28d13c5..08fe42c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -54,7 +54,6 @@ use cli::Args;
 use color_eyre::owo_colors::OwoColorize;
 use color_eyre::{Help, SectionExt};
 use config::Config;
-use cross_toml::BuildStd;
 use rustc::{QualifiedToolchain, Toolchain};
 use rustc_version::Channel;
 use serde::{Deserialize, Serialize, Serializer};
@@ -160,7 +159,7 @@ impl TargetTriple {
             "aarch64-unknown-freebsd" => Some("freebsd-arm64"),
             "x86_64-unknown-netbsd" => Some("netbsd-amd64"),
             "sparcv9-sun-solaris" => Some("solaris-sparc"),
-            "x86_64-pc-solaris" => Some("solaris-amd64"),
+            "x86_64-sun-solaris" => Some("solaris-amd64"),
             "thumbv6m-none-eabi" => Some("arm"),
             "thumbv7em-none-eabi" => Some("arm"),
             "thumbv7em-none-eabihf" => Some("armhf"),
@@ -542,7 +541,7 @@ pub fn run(
             target,
             uses_xargo,
             uses_zig,
-            build_std,
+            uses_build_std,
             zig_version,
             toolchain,
             is_remote,
@@ -587,7 +586,7 @@ pub fn run(
             rustup::setup_components(
                 &target,
                 uses_xargo,
-                build_std.enabled(),
+                uses_build_std,
                 &toolchain,
                 is_nightly,
                 available_targets,
@@ -595,8 +594,14 @@ pub fn run(
                 msg_info,
             )?;
 
-            let filtered_args =
-                get_filtered_args(zig_version, &args, &target, &config, is_nightly, &build_std);
+            let filtered_args = get_filtered_args(
+                zig_version,
+                &args,
+                &target,
+                &config,
+                is_nightly,
+                uses_build_std,
+            );
 
             let needs_docker = args
                 .subcommand
@@ -688,7 +693,7 @@ pub fn get_filtered_args(
     target: &Target,
     config: &Config,
     is_nightly: bool,
-    build_std: &BuildStd,
+    uses_build_std: bool,
 ) -> Vec<String> {
     let add_libc = |triple: &str| add_libc_version(triple, zig_version.as_deref());
     let mut filtered_args = if args
@@ -741,16 +746,9 @@ pub fn get_filtered_args(
     if is_test && config.doctests().unwrap_or_default() && is_nightly {
         filtered_args.push("-Zdoctest-xcompile".to_owned());
     }
-
-    if build_std.enabled() {
-        let mut arg = "-Zbuild-std".to_owned();
-        if let BuildStd::Crates(crates) = build_std {
-            arg.push('=');
-            arg.push_str(&crates.join(","));
-        }
-        filtered_args.push(arg);
+    if uses_build_std {
+        filtered_args.push("-Zbuild-std".to_owned());
     }
-
     filtered_args.extend(args.rest_args.iter().cloned());
     filtered_args
 }
@@ -771,14 +769,14 @@ pub fn setup(
         .clone()
         .or_else(|| config.target(&target_list))
         .unwrap_or_else(|| Target::from(host.triple(), &target_list));
-    let build_std = config.build_std(&target).unwrap_or_default();
-    let uses_xargo = !build_std.enabled() && config.xargo(&target).unwrap_or(!target.is_builtin());
+    let uses_build_std = config.build_std(&target).unwrap_or(false);
+    let uses_xargo = !uses_build_std && config.xargo(&target).unwrap_or(!target.is_builtin());
     let uses_zig = config.zig(&target).unwrap_or(false);
-    let zig_version = config.zig_version(&target);
+    let zig_version = config.zig_version(&target)?;
     let image = match docker::get_image(&config, &target, uses_zig) {
         Ok(i) => i,
         Err(docker::GetImageError::NoCompatibleImages(..))
-            if config.dockerfile(&target).is_some() =>
+            if config.dockerfile(&target)?.is_some() =>
         {
             "scratch".into()
         }
@@ -810,14 +808,14 @@ To override the toolchain mounted in the image, set `target.{target}.image.toolc
     };
     let is_remote = docker::Engine::is_remote();
     let engine = docker::Engine::new(None, Some(is_remote), msg_info)?;
-    let image = image.to_definite_with(&engine, msg_info)?;
+    let image = image.to_definite_with(&engine, msg_info);
     toolchain.replace_host(&image.platform);
     Ok(Some(CrossSetup {
         config,
         target,
         uses_xargo,
         uses_zig,
-        build_std,
+        uses_build_std,
         zig_version,
         toolchain,
         is_remote,
@@ -832,7 +830,7 @@ pub struct CrossSetup {
     pub target: Target,
     pub uses_xargo: bool,
     pub uses_zig: bool,
-    pub build_std: BuildStd,
+    pub uses_build_std: bool,
     pub zig_version: Option<String>,
     pub toolchain: QualifiedToolchain,
     pub is_remote: bool,
diff --git a/targets.toml b/targets.toml
index 9d46f0a..2ed7123 100644
--- a/targets.toml
+++ b/targets.toml
@@ -447,6 +447,7 @@ dylib = true
 std = true
 
 [[target]]
+disabled = true # https://github.com/cross-rs/cross/issues/1424
 target = "sparcv9-sun-solaris"
 os = "ubuntu-latest"
 cpp = true
@@ -454,7 +455,8 @@ dylib = true
 std = true
 
 [[target]]
-target = "x86_64-pc-solaris"
+disabled = true # https://github.com/cross-rs/cross/issues/1424
+target = "x86_64-sun-solaris"
 os = "ubuntu-latest"
 cpp = true
 dylib = true
diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml
index e7bd6b2..e0386c0 100644
--- a/xtask/Cargo.toml
+++ b/xtask/Cargo.toml
@@ -14,7 +14,7 @@ walkdir = "2.3.3"
 color-eyre = "0.6.2"
 eyre = "0.6.8"
 clap = { version = "4.1", features = ["derive", "env"] }
-which = { version = "4.2", default_features = false }
+which = { version = "4.2", default-features = false }
 serde = { version = "1", features = ["derive"] }
 serde_json = "1.0"
 shell-words = "1.1.0"
diff --git a/xtask/src/target_info.sh b/xtask/src/target_info.sh
index 1056d67..4be4497 100755
--- a/xtask/src/target_info.sh
+++ b/xtask/src/target_info.sh
@@ -288,9 +288,6 @@ case "${target}" in
             libc=$(max_glibc_version "${libdir}")
         fi
         ;;
-    riscv64gc-unknown-linux-gnu)
-        libc="$(dpkg-query --showformat='${Version}' --show libc6-riscv64-cross | cut -d- -f1)"
-        ;;
     *-*-linux-gnu*)
         toolchain_prefix="${!cc_var//-gcc/}"
         libdir="/usr/${toolchain_prefix}/lib"


Test patch:
diff --git a/ci/test.sh b/ci/test.sh
index 147c6b0..6a164ae 100755
--- a/ci/test.sh
+++ b/ci/test.sh
@@ -48,6 +48,10 @@ main() {
         # don't use xargo: should have native support just from rustc
         rustup toolchain add nightly
         CROSS+=("+nightly")
+    elif [[ "${TARGET}" == "riscv64gc-unknown-linux-gnu" ]]; then
+        # FIXME: riscv64gc-unknown-linux-gnu is broken on rustc 1.75, see https://github.com/cross-rs/cross/issues/1423
+        rustup toolchain add 1.70
+        CROSS+=("+1.70")
     fi
 
     if (( ${STD:-0} )); then