Files
hammer/tandas/staged-2026-06-26/fix-riscv64-test.patch
T
sergioandClaude Opus 4.8 08fdec3bbf Etapa G: fuel-5 — recarga la cola del VPS (parado 14h sin producir)
La cola previa (115) se agoto/enveneno: ultimo seal 2026-06-25T16:42,
~63 recetas fallan por deps no importadas (go/libconfuse/protoc/liblzma)
o C-heavy (libbpf). Diagnostico: el VPS giraba en falso re-confirmando
cache-hits ya cosechados.

- archiva la escoria de incoming/ (71 .toml + 38 .patch) a tandas/staged-2026-06-26/
- fuel-5: 18 candidatos CLI-Rust puro (anti-C); import 11/18 por nix, 10 pineados
  (aichat caligula cotp diskus otree pls projectable qrtool russ rwalk wthrr)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 03:27:38 -04:00

81 lines
2.6 KiB
Diff

From 5805151cffccc087942b9dd8d7ac10ca5f4f80a8 Mon Sep 17 00:00:00 2001
From: lapla <me@lapla.dev>
Date: Tue, 20 Jan 2026 18:47:13 +0900
Subject: [PATCH] fix: Resolve weak undefined symbols to zero in read-only
sections (#1474)
#1472
When a weak undefined symbol is referenced from a read-only section via
an absolute relocation, the resolved value should be 0, not the PLT
entry address.
---
libwild/src/elf_writer.rs | 6 ++++++
wild/tests/integration_tests.rs | 3 ++-
wild/tests/sources/undefined-weak-sym.c | 25 +++++++++++++++++++++++++
3 files changed, 33 insertions(+), 1 deletion(-)
create mode 100644 wild/tests/sources/undefined-weak-sym.c
diff --git a/libwild/src/elf_writer.rs b/libwild/src/elf_writer.rs
index 2923bc9e9..026636f0d 100644
--- a/libwild/src/elf_writer.rs
+++ b/libwild/src/elf_writer.rs
@@ -2574,6 +2574,12 @@ fn write_absolute_relocation<A: Arch>(
&layout.merged_strings,
&layout.merged_string_start_addresses,
)
+ } else if resolution.flags.is_dynamic()
+ && resolution.flags.is_absolute()
+ && !section_info.is_writable
+ {
+ // Weak undefined symbol referenced from a read-only section. Fill in as zero.
+ Ok(0)
} else if resolution.flags.is_interposable() && section_info.is_writable {
table_writer.write_dynamic_symbol_relocation::<A>(
place,
diff --git a/wild/tests/integration_tests.rs b/wild/tests/integration_tests.rs
index bc4730412..9dd611ba7 100644
--- a/wild/tests/integration_tests.rs
+++ b/wild/tests/integration_tests.rs
@@ -3320,7 +3320,8 @@ fn integration_test(
"wrap-real-only.c",
"ifunc-alias.c",
"ifunc-address-equality.c",
- "stack-size.c"
+ "stack-size.c",
+ "undefined-weak-sym.c"
)]
program_name: &'static str,
#[allow(unused_variables)] setup_symlink: (),
diff --git a/wild/tests/sources/undefined-weak-sym.c b/wild/tests/sources/undefined-weak-sym.c
new file mode 100644
index 000000000..b029ca7e2
--- /dev/null
+++ b/wild/tests/sources/undefined-weak-sym.c
@@ -0,0 +1,25 @@
+// A test for #1472.
+
+//#Object:runtime.c
+//#CompArgs:-fno-PIC
+//#Mode:dynamic
+//#Shared:force-dynamic-linking.c
+//#DiffIgnore:section.got
+//#DiffIgnore:.dynamic.DT_NEEDED
+//#DiffIgnore:.dynamic.DT_RELA
+//#DiffIgnore:.dynamic.DT_RELAENT
+//#DiffIgnore:rel.undefined-weak.dynamic.R_X86_64_GLOB_DAT
+
+#include "runtime.h"
+
+#define WEAK __attribute__((weak))
+
+int WEAK foo(void);
+
+void _start(void) {
+ runtime_init();
+ if (foo) {
+ exit_syscall(foo());
+ }
+ exit_syscall(42);
+}