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
This commit is contained in:
Piotr Tworek 2021-10-14 22:27:07 +02:00 committed by Christian Helmuth
parent e748efacd8
commit c38c2a6455
2 changed files with 14 additions and 0 deletions

View File

@ -2,6 +2,10 @@ SRC_CC += lx_hybrid.cc new_delete.cc capability_space.cc
SRC_CC += signal_transmitter.cc signal.cc SRC_CC += signal_transmitter.cc signal.cc
SRC_C += libgcc.c 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 new_delete.cc $(BASE_DIR)/src/lib/cxx
vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid
vpath libgcc.c $(REP_DIR)/src/lib/lx_hybrid vpath libgcc.c $(REP_DIR)/src/lib/lx_hybrid

View File

@ -11,10 +11,14 @@
* under the terms of the GNU Affero General Public License version 3. * under the terms of the GNU Affero General Public License version 3.
*/ */
/* Genode includes */
#include <base/log.h> #include <base/log.h>
#include <base/allocator.h> #include <base/allocator.h>
#include <base/sleep.h> #include <base/sleep.h>
/* C++ runtime includes */
#include <new>
using Genode::size_t; using Genode::size_t;
using Genode::Allocator; using Genode::Allocator;
using Genode::Deallocator; 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. " Genode::error("cxx: operator delete (void *, unsigned long, std::align_val_t) called - not implemented. "
"A working implementation is available in the 'stdcxx' library."); "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.");
}