public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libgcc/61752] New: on cygwin, aborts during exit() with a dynamically loaded C++ library
@ 2014-07-08 16:58 jon.turney at dronecode dot org.uk
  2014-07-08 17:03 ` [Bug libgcc/61752] " jon.turney at dronecode dot org.uk
  2014-07-22 13:14 ` jon.turney at dronecode dot org.uk
  0 siblings, 2 replies; 3+ messages in thread
From: jon.turney at dronecode dot org.uk @ 2014-07-08 16:58 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61752

            Bug ID: 61752
           Summary: on cygwin, aborts during exit() with a dynamically
                    loaded C++ library
           Product: gcc
           Version: 4.8.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libgcc
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jon.turney at dronecode dot org.uk
            Target: i686-pc-cygwin

There seems to be a problem somehow related to having a C++ library which does
depend on libgcc dynamically loaded by a C program which doesn't depend on
libgcc, where abort is being called during exit()

This seems to be specific to x86 cygwin/mingw targets with dw2 eh

test.c:

#include <assert.h>
#include <dlfcn.h>

int main()
{
   void *h = dlopen("dllib.dll", 0);
   assert(h);
   dlclose(h);
}

dllib.c:

#include <fstream>

std::fstream instance;

Makefile:

all:
        g++ -g -O0 -c dllib.cc
        g++ -g -O0 -shared -o dllib.dll dllib.o
        gcc -g -O0 -o test.exe test.c
        ./test


Running under gdb shows gcc_abort() in __deregister_frame_info_bases() is being
hit

$ gdb test
[...]
Program received signal SIGABRT, Aborted.
0x0028da18 in ?? ()
(gdb) bt
#0  0x0028da18 in ?? ()
#1  0x74f912cc in WriteFile () from /cygdrive/c/Windows/syswow64/kernel32.dll
#2  0x610da70c in sig_send(_pinfo*, siginfo_t&, _cygtls*)@12
(p=p@entry=0x60fd0000, si=..., tls=tls@entry=0x0)
    at /usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/sigproc.cc:638
#3  0x610d7dbc in _pinfo::kill(siginfo_t&)@8 (this=0x60fd0000, si=...)
    at /usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/signal.cc:248
#4  0x610d8286 in kill0 (pid=pid@entry=5044, si=...) at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/signal.cc:299
#5  0x610d8452 in kill (sig=sig@entry=6, pid=5044) at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/signal.cc:308
#6  raise (sig=sig@entry=6) at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/signal.cc:284
#7  0x610d86f3 in abort () at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/signal.cc:371
#8  0x699134d1 in __deregister_frame_info_bases (begin=0x404038
<__EH_FRAME_BEGIN__>)
    at /usr/src/debug/gcc-4.8.3-1/libgcc/unwind-dw2-fde.c:216
#9  0x00401182 in __gcc_deregister_frame ()
#10 0x61006466 in do_global_dtors () at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/dcrt0.cc:62
#11 0x61159aba in __call_exitprocs (code=code@entry=0, d=d@entry=0x0)
    at /usr/src/debug/cygwin-1.7.30-1/newlib/libc/stdlib/__call_atexit.c:118
#12 0x611305d8 in exit (code=0) at
/usr/src/debug/cygwin-1.7.30-1/newlib/libc/stdlib/exit.c:66
#13 0x61006b39 in cygwin_exit (n=0) at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/dcrt0.cc:1248
#14 0x61008041 in cygwin_exit_return () at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/dcrt0.cc:1041
#15 0x61005e84 in _cygtls::call2(unsigned long (*)(void*, void*), void*,
void*)@16 (this=<optimized out>,
    func=func@entry=0x610071d0 <dll_crt0_1(void*)>, arg=arg@entry=0x0,
buf=buf@entry=0x28cd84)
    at /usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/cygtls.cc:100
#16 0x61005ff6 in _cygtls::call (func=func@entry=0x610071d0
<dll_crt0_1(void*)>, arg=arg@entry=0x0)
    at /usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/cygtls.cc:30
#17 0x61006f54 in _dll_crt0@0 () at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/dcrt0.cc:1098
#18 0x00401222 in cygwin_crt0 (f=0x4011a0 <main>) at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/lib/cygwin_crt0.c:22
#19 0x00401015 in mainCRTStartup () at
/usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/crt0.c:29


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug libgcc/61752] on cygwin, aborts during exit() with a dynamically loaded C++ library
  2014-07-08 16:58 [Bug libgcc/61752] New: on cygwin, aborts during exit() with a dynamically loaded C++ library jon.turney at dronecode dot org.uk
@ 2014-07-08 17:03 ` jon.turney at dronecode dot org.uk
  2014-07-22 13:14 ` jon.turney at dronecode dot org.uk
  1 sibling, 0 replies; 3+ messages in thread
From: jon.turney at dronecode dot org.uk @ 2014-07-08 17:03 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61752

--- Comment #1 from jon.turney at dronecode dot org.uk ---
Created attachment 33092
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33092&action=edit
Patch to cygming-crtbegin.c to prevent libgcc pinning itself in memory

This seems to be caused by the fix for pr 57982, to fix a different abort
during __gcc_deregister_frame()

Since that change is baked into libgcc itself, that patch has the side-effect
of making libgcc pin itself in memory.

I can't really tell from what's written there if that was deliberate or not,
but it seems that it introduces a different problem when the executable doesn't
have a dependency on libgcc.

Attached is a patch which modifies __gcc_register_frame() to avoid it pinning
itself in memory.

Alternatively, as [1] says, the assert in __deregister_frame_info_bases()
itself could be removed. 

[1] http://www.mail-archive.com/gcc@gcc.gnu.org/msg68286.html


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug libgcc/61752] on cygwin, aborts during exit() with a dynamically loaded C++ library
  2014-07-08 16:58 [Bug libgcc/61752] New: on cygwin, aborts during exit() with a dynamically loaded C++ library jon.turney at dronecode dot org.uk
  2014-07-08 17:03 ` [Bug libgcc/61752] " jon.turney at dronecode dot org.uk
@ 2014-07-22 13:14 ` jon.turney at dronecode dot org.uk
  1 sibling, 0 replies; 3+ messages in thread
From: jon.turney at dronecode dot org.uk @ 2014-07-22 13:14 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61752

--- Comment #2 from jon.turney at dronecode dot org.uk ---
Better patch: https://cygwin.com/ml/cygwin/2014-07/msg00180.html


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-07-22 13:14 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-08 16:58 [Bug libgcc/61752] New: on cygwin, aborts during exit() with a dynamically loaded C++ library jon.turney at dronecode dot org.uk
2014-07-08 17:03 ` [Bug libgcc/61752] " jon.turney at dronecode dot org.uk
2014-07-22 13:14 ` jon.turney at dronecode dot org.uk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).