From 5f64d4ad637486d6c9ab0ee823ecf14c521e1505 Mon Sep 17 00:00:00 2001 From: Hiroaki Yutani Date: Tue, 14 Apr 2026 22:54:35 +0900 Subject: [PATCH 1/4] Add -flto=10 to check if this fails --- src/Makevars.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makevars.in b/src/Makevars.in index 548bbc3..69245d6 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -21,7 +21,7 @@ $(STATLIB): fi export CC="$(CC)" && \ - export CFLAGS="$(CFLAGS)" && \ + export CFLAGS="$(CFLAGS) -flto=10" && \ if [ "$(TARGET)" != "wasm32-unknown-emscripten" ]; then \ @BEFORE_CARGO_BUILD@ cd ./rust && cargo build --jobs 1 --lib --release $(OFFLINE_OPTION); \ else \ From 065fa585bd1a2bc46e13e5e2edc744f12c43ebe3 Mon Sep 17 00:00:00 2001 From: Hiroaki Yutani Date: Tue, 14 Apr 2026 22:58:03 +0900 Subject: [PATCH 2/4] Revert --- src/Makevars.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makevars.in b/src/Makevars.in index 69245d6..548bbc3 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -21,7 +21,7 @@ $(STATLIB): fi export CC="$(CC)" && \ - export CFLAGS="$(CFLAGS) -flto=10" && \ + export CFLAGS="$(CFLAGS)" && \ if [ "$(TARGET)" != "wasm32-unknown-emscripten" ]; then \ @BEFORE_CARGO_BUILD@ cd ./rust && cargo build --jobs 1 --lib --release $(OFFLINE_OPTION); \ else \ From d9a9f9fb748bb6a52e5f2c134165a09ca392a67e Mon Sep 17 00:00:00 2001 From: Hiroaki Yutani Date: Tue, 14 Apr 2026 22:58:27 +0900 Subject: [PATCH 3/4] Fix --- src/Makevars.in | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Makevars.in b/src/Makevars.in index 548bbc3..6532d92 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -20,8 +20,13 @@ $(STATLIB): cp ./cargo_vendor_config.toml ./rust/.cargo/config.toml; \ fi +# Note: -fno-lto is appended to CFLAGS to override any -flto* injected by R +# (e.g. the gcc-SAN builder uses -flto=10). The cc crate compiles savvy's +# unwind_protect_wrapper.c with these CFLAGS and archives the result with +# plain `ar`, which doesn't record GCC LTO symbols, leaving +# unwind_protect_impl undefined at dyn.load time. export CC="$(CC)" && \ - export CFLAGS="$(CFLAGS)" && \ + export CFLAGS="$(CFLAGS) -flto=10 -fno-lto" && \ if [ "$(TARGET)" != "wasm32-unknown-emscripten" ]; then \ @BEFORE_CARGO_BUILD@ cd ./rust && cargo build --jobs 1 --lib --release $(OFFLINE_OPTION); \ else \ From 05ef2792c4147792586755e3d53309d642949c65 Mon Sep 17 00:00:00 2001 From: Hiroaki Yutani Date: Tue, 14 Apr 2026 23:02:14 +0900 Subject: [PATCH 4/4] Tweak --- src/Makevars.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makevars.in b/src/Makevars.in index 6532d92..0d02d74 100644 --- a/src/Makevars.in +++ b/src/Makevars.in @@ -26,7 +26,7 @@ $(STATLIB): # plain `ar`, which doesn't record GCC LTO symbols, leaving # unwind_protect_impl undefined at dyn.load time. export CC="$(CC)" && \ - export CFLAGS="$(CFLAGS) -flto=10 -fno-lto" && \ + export CFLAGS="$(CFLAGS) -fno-lto" && \ if [ "$(TARGET)" != "wasm32-unknown-emscripten" ]; then \ @BEFORE_CARGO_BUILD@ cd ./rust && cargo build --jobs 1 --lib --release $(OFFLINE_OPTION); \ else \