This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libstdc++/82122] New: Overloaded operator new/delete in MinGW is not calling from .dlls


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]