https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82122
Bug ID: 82122 Summary: Overloaded operator new/delete in MinGW is not calling from .dlls Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: drizt at land dot ru Target Milestone: --- $ /usr/bin/i686-w64-mingw32-gcc -v Using built-in specs. COLLECT_GCC=/usr/bin/i686-w64-mingw32-gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/i686-w64-mingw32/7.2.0/lto-wrapper Target: i686-w64-mingw32 Configured with: ../configure --prefix=/usr --bindir=/usr/bin --includedir=/usr/include --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --with-gnu-as --with-gnu-ld --verbose --without-newlib --disable-multilib --disable-plugin --with-system-zlib --disable-nls --without-included-gettext --disable-win32-registry --enable-languages=c,c++,objc,obj-c++,fortran --with-bugurl=http://bugzilla.redhat.com/bugzilla --with-cloog --enable-threads=posix --enable-libgomp --target=i686-w64-mingw32 --with-sysroot=/usr/i686-w64-mingw32/sys-root --with-gxx-include-dir=/usr/i686-w64-mingw32/sys-root/mingw/include/c++ Thread model: posix gcc version 7.2.0 20170814 (Fedora MinGW 7.2.0-1.fc26) (GCC) For MinGW targets overloading new/delete operators is not applied for .dll files. I tested it with Fedora 26 MinGW, MinGW 4.9.2 and MinGW 4.8.2 on Windows 7. Here I show log for Fedora MinGW Source files: $ cat lib.cpp #include "lib.h" #include <cstdio> #include <cstdlib> void func(A *a) { std::printf("library delete called, pointer = 0x%p\n", a); delete a; } $ cat lib.h class A { int a; }; void func(A *a); $ cat main.cpp #include "lib.h" #include <cstdio> #include <cstdlib> // replacement of a minimal set of functions: void *operator new(std::size_t sz) { void *ptr = std::malloc(sz); std::printf("global op new called, size = %zu, pointer = 0x%p\n", sz, ptr); return ptr; } void operator delete(void* ptr) noexcept { std::printf("global op delete called, pointer = 0x%p\n", ptr); std::free(ptr); } int main() { A *a = new A(); A *b = new A(); func(a); delete b; return 0; } Compile: $ i686-w64-mingw32-g++ -Dlib_EXPORTS -std=c++11 -o lib.cpp.obj -c lib.cpp $ i686-w64-mingw32-g++ -std=c++11 -shared -o liblib.dll lib.cpp.obj $ i686-w64-mingw32-g++ -std=c++11 -o main.cpp.obj -c main.cpp $ i686-w64-mingw32-g++ -std=c++11 -o main.exe liblib.dll -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 main.cpp.obj Output: $ ./main.exe fixme:winediag:start_process Wine Staging 2.15 is a testing version containing experimental patches. fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org. global op new called, size = 4, pointer = 0x00241718 global op new called, size = 4, pointer = 0x00246268 library delete called, pointer = 0x00241718 global op delete called, pointer = 0x00246268 The same with Linux gcc output: $ ./main global op new called, size = 4, pointer = 0x0x1accc20 global op new called, size = 4, pointer = 0x0x1acd050 library delete called, pointer = 0x0x1accc20 global op delete called, pointer = 0x0x1accc20 global op delete called, pointer = 0x0x1acd050