From c38c2a64555e10b388de5ed4902b77552955f2ea Mon Sep 17 00:00:00 2001 From: Piotr Tworek Date: Thu, 14 Oct 2021 22:27:07 +0200 Subject: [PATCH] cxx: missing operator delete with align_val_t arg When rebasing my local branch on top of sculpt-21.10 tag I've noticed two problems. The code in new_delete.cc does not include new header file. This works fine with GCC, but fails with clang because std::align_val_t type is not defined anywhere according to clang. It looks like GCC pulls this header indirectly somehow. The second problem can be seen if one disallows undefined symbols in executables and shared_libraries. This can be seen with both GCC and clang by adding --no-undefined to LD_OPT. With such change in place core fails to link due to: ld.lld: error: undefined symbol: operator delete(void*, std::align_val_t) >>> referenced by thread.h:448 (/home/tworaz/devel/genode/repos/base-hw/src/core/kernel/thread.h:448) >>> thread.o:(Kernel::Core_main_thread::~Core_main_thread()) in archive debug/core-hw-virt_qemu.a >>> referenced by thread.h:448 (/home/tworaz/devel/genode/repos/base-hw/src/core/kernel/thread.h:448) >>> thread.o:(non-virtual thunk to Kernel::Core_main_thread::~Core_main_thread()) in archive debug/core-hw-virt_qemu.a >>> did you mean: operator delete(void*, unsigned long, std::align_val_t) >>> defined in: debug/core-hw-virt_qemu.a(supc++.o) If the code would somehow manage call such undefined symbol it'd crash. Since I generally prefer link time failures to runtime crashes I link all genode binaries with --no-undefined. To fix this problem just add a dummy implementation of missing delete operator. Fixes #4298 --- repos/base-linux/lib/mk/lx_hybrid.mk | 4 ++++ repos/base/src/lib/cxx/new_delete.cc | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/repos/base-linux/lib/mk/lx_hybrid.mk b/repos/base-linux/lib/mk/lx_hybrid.mk index 43f93b6ee1..f76f4256a1 100644 --- a/repos/base-linux/lib/mk/lx_hybrid.mk +++ b/repos/base-linux/lib/mk/lx_hybrid.mk @@ -2,6 +2,10 @@ SRC_CC += lx_hybrid.cc new_delete.cc capability_space.cc SRC_CC += signal_transmitter.cc signal.cc SRC_C += libgcc.c +# new_delete.cc uses libsupc++ which means we need to access +# its include directory. +STDINC := yes + vpath new_delete.cc $(BASE_DIR)/src/lib/cxx vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid vpath libgcc.c $(REP_DIR)/src/lib/lx_hybrid diff --git a/repos/base/src/lib/cxx/new_delete.cc b/repos/base/src/lib/cxx/new_delete.cc index 62bb3563ec..eca8dee86f 100644 --- a/repos/base/src/lib/cxx/new_delete.cc +++ b/repos/base/src/lib/cxx/new_delete.cc @@ -11,10 +11,14 @@ * under the terms of the GNU Affero General Public License version 3. */ +/* Genode includes */ #include #include #include +/* C++ runtime includes */ +#include + using Genode::size_t; using Genode::Allocator; using Genode::Deallocator; @@ -86,3 +90,9 @@ __attribute__((weak)) void operator delete (void *, unsigned long, std::align_va Genode::error("cxx: operator delete (void *, unsigned long, std::align_val_t) called - not implemented. " "A working implementation is available in the 'stdcxx' library."); } + +__attribute__((weak)) void operator delete (void *, std::align_val_t) noexcept +{ + Genode::error("cxx: operator delete (void *, std::align_val_t) called - not implemented. " + "A working implementation is available in the 'stdcxx' library."); +}