cxx: make 'operator delete(void *)' a weak symbol

The 'delete (void *)' operator gets referenced by compiler generated code,
so it must be publicly defined in the 'cxx' library. These compiler
generated calls seem to get executed only subsequently to explicit
'delete (void *)' calls in application code, which are not supported by
the 'cxx' library, so the 'delete (void *)' implementation in the 'cxx'
library does not have to do anything. Applications should use the
'delete (void *)' implementation of the 'stdcxx' library instead. To make
this possible, the 'delete (void *)' implementation in the 'cxx' library
must be 'weak'.

Fixes #419.
This commit is contained in:
Christian Prochaska 2012-10-18 04:57:40 +02:00 committed by Norman Feske
parent ae8c464495
commit 17dc60eb66

View File

@ -42,3 +42,19 @@ void operator delete (void *ptr, Genode::Allocator *alloc)
PERR("C++ runtime: delete called with unsafe allocator, leaking memory");
}
/*
* The 'delete (void *)' operator gets referenced by compiler generated code,
* so it must be publicly defined in the 'cxx' library. These compiler
* generated calls seem to get executed only subsequently to explicit
* 'delete (void *)' calls in application code, which are not supported by the
* 'cxx' library, so the 'delete (void *)' implementation in the 'cxx' library
* does not have to do anything. Applications should use the 'delete (void *)'
* implementation of the 'stdcxx' library instead. To make this possible, the
* 'delete (void *)' implementation in the 'cxx' library must be 'weak'.
*/
__attribute__((weak)) void operator delete (void *)
{
PERR("cxx: operator delete (void *) called - not implemented. "
"A working implementation is available in the 'stdcxx' library.");
}