From 3f812abfb20a21c1427270aa8a59c5e2ddf8c7d3 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 28 Aug 2024 09:01:21 +0900 Subject: [PATCH] fix shared library build with llvm-19 (#526) --- Makefile | 18 +++++++++++++++--- libc-top-half/musl/src/signal/psignal.c | 7 +++++++ linker-provided-symbols.txt | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 linker-provided-symbols.txt diff --git a/Makefile b/Makefile index f06bd75cb..4f4b954fc 100644 --- a/Makefile +++ b/Makefile @@ -617,9 +617,21 @@ PIC_OBJS = \ # link that using `--whole-archive` rather than pass the object files directly # to CC. This is a workaround for a Windows command line size limitation. See # the `%.a` rule below for details. -$(SYSROOT_LIB)/%.so: $(OBJDIR)/%.so.a $(BUILTINS_LIB) - $(CC) --target=$(TARGET_TRIPLE) -nodefaultlibs -shared --sysroot=$(SYSROOT) \ - -o $@ -Wl,--whole-archive $< -Wl,--no-whole-archive $(BUILTINS_LIB) + +# Note: libc.so is special because it shouldn't link to libc.so. +# Note: --allow-undefined-file=linker-provided-symbols.txt is +# a workaround for https://github.com/llvm/llvm-project/issues/103592 +$(SYSROOT_LIB)/libc.so: $(OBJDIR)/libc.so.a $(BUILTINS_LIB) + $(CC) $(EXTRA_CFLAGS) --target=${TARGET_TRIPLE} -nodefaultlibs \ + -shared --sysroot=$(SYSROOT) \ + -o $@ -Wl,--whole-archive $< -Wl,--no-whole-archive $(BUILTINS_LIB) \ + -Wl,--allow-undefined-file=linker-provided-symbols.txt + +$(SYSROOT_LIB)/%.so: $(OBJDIR)/%.so.a $(SYSROOT_LIB)/libc.so + $(CC) $(EXTRA_CFLAGS) --target=${TARGET_TRIPLE} \ + -shared --sysroot=$(SYSROOT) \ + -o $@ -Wl,--whole-archive $< -Wl,--no-whole-archive \ + -Wl,--allow-undefined-file=linker-provided-symbols.txt $(OBJDIR)/libc.so.a: $(LIBC_SO_OBJS) $(MUSL_PRINTSCAN_LONG_DOUBLE_SO_OBJS) diff --git a/libc-top-half/musl/src/signal/psignal.c b/libc-top-half/musl/src/signal/psignal.c index 138dbe00f..5b9dc38fa 100644 --- a/libc-top-half/musl/src/signal/psignal.c +++ b/libc-top-half/musl/src/signal/psignal.c @@ -3,6 +3,13 @@ #include #include +#ifndef __wasilibc_unmodified_upstream +/* undef the macro to use the standard stderr instead of __stderr_FILE + * (the libc internal symbol) as this lives in a separate library, + * libwasi-emulated-signal.so. */ +#undef stderr +#endif + void psignal(int sig, const char *msg) { FILE *f = stderr; diff --git a/linker-provided-symbols.txt b/linker-provided-symbols.txt new file mode 100644 index 000000000..8508f8d50 --- /dev/null +++ b/linker-provided-symbols.txt @@ -0,0 +1,3 @@ +__heap_base +__heap_end +__c_longjmp