diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-10-06 08:50:00 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-06 21:20:00 +0530 |
commit | cd1c63ad71965df6ee95d156fd17271177bd50c8 (patch) | |
tree | 724d0f8ecd30edb42e99d3ece730d8cea1f6efab | |
parent | 9102ba9b0f50ba1fe4f13111ec66ac4e09ba2db4 (diff) |
fix(build): don't export all symbols to dynamic symbol table (#16171)
Currently, we use `-rdynamic` for exporting Node API symbols to the
symbol table. `-rdynamic` will export *all* symbols, that means
previously unused functions will not be optimized away introducing a lot
of binary bloat.
This patch uses `-exported_symbol` and `--export-dynamic-symbol` link
flags (not as universal as `-rdynamic`) to only mark Node API symbols to
be put in the dynamic symbol table.
-rw-r--r-- | .github/workflows/ci.yml | 3 | ||||
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | cli/Cargo.toml | 1 | ||||
-rw-r--r-- | cli/build.rs | 31 |
4 files changed, 34 insertions, 2 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2da07b31f..28c9bbdcd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,7 @@ jobs: - os: ${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }} job: test profile: debug + use_sysroot: true - os: ${{ github.repository == 'denoland/deno' && 'ubuntu-20.04-xl' || 'ubuntu-20.04' }} job: lint profile: debug @@ -412,7 +413,7 @@ jobs: # Verify that the binary actually works in the Ubuntu-16.04 sysroot. - name: Check deno binary (in sysroot) - if: matrix.use_sysroot + if: matrix.profile == 'release' && matrix.use_sysroot run: sudo chroot /sysroot "$(pwd)/target/release/deno" --version # TODO(ry): Because CI is so slow on for OSX and Windows, we currently diff --git a/Cargo.lock b/Cargo.lock index 071665eb5..988fe6269 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -869,6 +869,7 @@ dependencies = [ "rustyline-derive", "semver 1.0.14", "serde", + "serde_json", "serde_repr", "shell-escape", "tar", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 9d668f8a5..31f60216e 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -41,6 +41,7 @@ deno_websocket = { version = "0.76.0", path = "../ext/websocket" } deno_webstorage = { version = "0.66.0", path = "../ext/webstorage" } regex = "=1.6.0" serde = { version = "=1.0.144", features = ["derive"] } +serde_json = "1.0.64" zstd = '=0.11.2' [target.'cfg(windows)'.build-dependencies] diff --git a/cli/build.rs b/cli/build.rs index aaa29a6d0..c1bc3305e 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -344,7 +344,36 @@ fn main() { ); #[cfg(not(target_os = "windows"))] - println!("cargo:rustc-link-arg-bin=deno=-rdynamic"); + { + // Load the symbols file generated by the `napi_sym` macro. + #[derive(serde::Deserialize)] + struct Symbols { + symbols: Vec<String>, + } + let symbols_json = + std::fs::read_to_string("../tools/napi/symbol_exports.json").expect( + "Missing tools/napi/symbol_exports.json! This is a bug in napi_sym", + ); + let symbols: Symbols = serde_json::from_str(&symbols_json) + .expect("tools/napi/symbol_exports.json is not valid JSON"); + + // Don't export all symbols into the dynamic symbol table. -rdynamic exports *all* symbols introducing binary bloat. + // We only need to export Node API symbols. + for symbol in symbols.symbols { + // TODO(@littledivy): We _might_ hit an argument size limit? + // Maybe use `--export-dynamic-symbol-list` / `--exported_symbols_list` instead? https://reviews.llvm.org/D107317 + #[cfg(target_os = "macos")] + println!( + "cargo:rustc-link-arg-bin=deno=-Wl,-exported_symbol,_{}", + symbol + ); + #[cfg(target_os = "linux")] + println!( + "cargo:rustc-link-arg-bin=deno=-Wl,--export-dynamic-symbol={}", + symbol + ); + } + } // To debug snapshot issues uncomment: // op_fetch_asset::trace_serializer(); |