1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

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.
This commit is contained in:
Divy Srivastava 2022-10-06 08:50:00 -07:00 committed by GitHub
parent 9102ba9b0f
commit cd1c63ad71
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 2 deletions

View file

@ -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

1
Cargo.lock generated
View file

@ -869,6 +869,7 @@ dependencies = [
"rustyline-derive",
"semver 1.0.14",
"serde",
"serde_json",
"serde_repr",
"shell-escape",
"tar",

View file

@ -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]

View file

@ -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();