delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2025/07/25/13:29:24

DMARC-Filter: OpenDMARC Filter v1.4.2 delorie.com 56PHTNa32298312
Authentication-Results: delorie.com; dmarc=pass (p=none dis=none) header.from=cygwin.com
Authentication-Results: delorie.com; spf=pass smtp.mailfrom=cygwin.com
DKIM-Filter: OpenDKIM Filter v2.11.0 delorie.com 56PHTNa32298312
Authentication-Results: delorie.com;
dkim=pass (1024-bit key, unprotected) header.d=cygwin.com header.i=@cygwin.com header.a=rsa-sha256 header.s=default header.b=rm/9hRJ/
X-Recipient: archive-cygwin AT delorie DOT com
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 317F1384F001
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com;
s=default; t=1753464562;
bh=9Us0lMU1OelwK3mYFQW4sB3i8EvWQI6FDAoIT1kuE7s=;
h=Date:To:cc:Subject:In-Reply-To:References:List-Id:
List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe:
From:Reply-To:From;
b=rm/9hRJ/BTbl12VVOhL9TZytMHdixWlntMMAVW6//ONFHsNrusMffCRqzGRuv6tuS
BfFroGGR1zknQhzs64TJhjkhX6a9dESJ/+A9/WquALCd3ewwbEgNX7+lIU1GCX9gHH
50c9JiGuUZQpF4B6ZevrFVEtijihQhtw7txJXMUU=
X-Original-To: cygwin AT cygwin DOT com
Delivered-To: cygwin AT cygwin DOT com
DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C8265385040F
ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C8265385040F
ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1753464534; cv=none;
b=wOw47a5RKN0LG46wikXX/EQVCCCxE94KpoJ18fz1P+G1o7G9UsUOaHHhGbwkz4QVIrcZn5X9FZICDKnnsVxmrt/J56iN34pIqadQ8Z5aLiNCjjtJUzIkVtFnBvW21/Yn1l67Dxoi5GUbwoZNvr2rwoiypmykcsAD3VkfUsCz7tU=
ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key;
t=1753464534; c=relaxed/simple;
bh=BDU1q34H5+VPiczRdXb/MjE8dNQ7JLTsmw/uKke2EEM=;
h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;
b=dYbqi1i/f7EpSucHFebN02uhIXkUmyd71q4apqiBxpNxAailfeBrgaY82YQ/yTLD31eYx8n2eCNLISnCymjGOMbKX4b45U7w/a5CaTuCQGYwKKVs7PuUNZiahi+YeMX0fcEXak59hQNyXin5PdW9g7dPDVybLN9h55cgxNaA4xY=
ARC-Authentication-Results: i=1; server2.sourceware.org
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C8265385040F
Date: Fri, 25 Jul 2025 10:28:54 -0700 (PDT)
X-X-Sender: jeremyd AT resin DOT csoft DOT net
To: Corinna Vinschen via Cygwin <cygwin AT cygwin DOT com>
cc: Corinna Vinschen <corinna-cygwin AT cygwin DOT com>
Subject: Re: new c++ new/delete overloads need wrapping?
In-Reply-To: <aINAAW2oh-EfgP0V@calimero.vinschen.de>
Message-ID: <59ba736a-21c7-a004-e5a1-6554df3b58f1@jdrake.com>
References: <81535510-8360-1c72-442a-0b630a6d937f AT jdrake DOT com>
<aINAAW2oh-EfgP0V AT calimero DOT vinschen DOT de>
MIME-Version: 1.0
X-BeenThere: cygwin AT cygwin DOT com
X-Mailman-Version: 2.1.30
List-Id: General Cygwin discussions and problem reports <cygwin.cygwin.com>
List-Unsubscribe: <https://cygwin.com/mailman/options/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
List-Archive: <https://cygwin.com/pipermail/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-request AT cygwin DOT com?subject=help>
List-Subscribe: <https://cygwin.com/mailman/listinfo/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
From: Jeremy Drake via Cygwin <cygwin AT cygwin DOT com>
Reply-To: Jeremy Drake <cygwin AT jdrake DOT com>
Errors-To: cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com
Sender: "Cygwin" <cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com>

On Fri, 25 Jul 2025, Corinna Vinschen via Cygwin wrote:

> On Jul 24 22:41, Jeremy Drake via Cygwin wrote:
> > I was looking into C++ new/delete --wrap linker options, and noticed that
> > in a quick test the wrapper for delete was not being called.  This was
> > because delete is being compiled to _ZdlPvm and that symbol is not present
> > in the --wrap arguments in the GCC spec, and is not part of the
> > per_process_cxx_malloc struct.  I'm not seeing anything in that cxx_malloc
> > struct like a size or version number, so I don't know a good way to
> > extend it given that it is part of the startup code linked into every
> > binary.
> >
> > Here are the current symbols from libc++ and how they demangle:
> >
> > _ZdaPv	operator delete[](void*)
> > _ZdaPvm	operator delete[](void*, unsigned long)
> > _ZdaPvmSt11align_val_t	operator delete[](void*, unsigned long, std::align_val_t)
> > _ZdaPvRKSt9nothrow_t	operator delete[](void*, std::nothrow_t const&)
> > _ZdaPvSt11align_val_t	operator delete[](void*, std::align_val_t)
> > _ZdaPvSt11align_val_tRKSt9nothrow_t	operator delete[](void*, std::align_val_t, std::nothrow_t const&)
> > _ZdlPv	operator delete(void*)
> > _ZdlPvm	operator delete(void*, unsigned long)
> > _ZdlPvmSt11align_val_t	operator delete(void*, unsigned long, std::align_val_t)
> > _ZdlPvRKSt9nothrow_t	operator delete(void*, std::nothrow_t const&)
> > _ZdlPvSt11align_val_t	operator delete(void*, std::align_val_t)
> > _ZdlPvSt11align_val_tRKSt9nothrow_t	operator delete(void*, std::align_val_t, std::nothrow_t const&)
> > _Znam	operator new[](unsigned long)
> > _ZnamRKSt9nothrow_t	operator new[](unsigned long, std::nothrow_t const&)
> > _ZnamSt11align_val_t	operator new[](unsigned long, std::align_val_t)
> > _ZnamSt11align_val_tRKSt9nothrow_t	operator new[](unsigned long, std::align_val_t, std::nothrow_t const&)
> > _Znwm	operator new(unsigned long)
> > _ZnwmRKSt9nothrow_t	operator new(unsigned long, std::nothrow_t const&)
> > _ZnwmSt11align_val_t	operator new(unsigned long, std::align_val_t)
> > _ZnwmSt11align_val_tRKSt9nothrow_t	operator new(unsigned long, std::align_val_t, std::nothrow_t const&)
>
> Wow, these got a lot more since we started to support this back in
> 2009 and ported to 64 bit in 2013.

Yeah, it looks like they added aligned new/delete and sized delete, and
then had a combinatorial explosion.

> But first I have to tell you that I'm fuzzy on how this exactly is
> working together.  I can't tell you how this affects GCC or LD.

I was looking at this because it's not working correctly with LLD.

> Nevertheless, the code overriding the members in per_process_cxx_malloc
> is living in the app (_cygwin_crt0_common.cc).  If you just append members
> to per_process_cxx_malloc nad implement the wrappers in cxx.cc and
> libstdcxx_wrapper.cc, then old apps using the old _cygwin_crt0_common.cc
> will just not see the new functions.  So that should work out of the
> box, shouldn't it?

I missed a pointer dereference in _cygwin_crt0_common.cc that meant the
struct was being copied rather than the pointer replaced.  I was concerned
that a pointer to the old struct might be used, and garbage found in the
new fields.  I see now that it copies the contents, and if the struct is
smaller it will obviously leave the new fields alone.

I came across this comment that concerned me though
  /* Broken DLLs built against Cygwin versions 1.7.0-49 up to 1.7.0-57
     override the cxx_malloc pointer in their DLL initialization code,
     when loaded either statically or dynamically.  Because this leaves
     a stale pointer into demapped memory space if the DLL is unloaded
     by a call to dlclose, we prevent this happening for dynamically
     loaded DLLs in dlopen by saving and restoring cxx_malloc around
     the call to LoadLibrary, which invokes the DLL's startup sequence.
     Modern DLLs won't even attempt to override the pointer when loaded
     statically, but will write their overrides directly into the
     struct it points to.  With all modern DLLs, this will remain the
     default_cygwin_cxx_malloc struct in cxx.cc, but if any broken DLLs
     are in the mix they will have overridden the pointer and subsequent
     overrides will go into their embedded cxx_malloc structs.  This is
     almost certainly not a problem as they can never be unloaded, but
     if we ever did want to do anything about it, we could check here to
     see if the pointer had been altered in the early parts of the DLL's
     startup, and if so copy back the new overrides and reset it here.
     However, that's just a note for the record; at the moment, we can't
     see any need to worry about this happening.  */

I don't see the save and restore mentioned in dlopen...  Are these old
DLLs sufficiently old that there wasn't 64-bit yet, and therefore can't be
used anymore?

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019