Major bug -- Exception handling broken
Parker, Ron
rdparker@butlermfg.com
Wed May 31 15:06:00 GMT 2000
> > Exception handling in g++ is totally broken in the current Cygwin
> > release. Almost any program that uses exceptions crashes:
> >
> > class Foo {};
> > int main() {
> > try { throw Foo(); }
> > catch (const Foo&) { return 0; }
> > }
> >
> > $ g++ foo.cpp -o foo
> > $ ./foo
> > 0 [main] foo 1007 handle_exceptions: Exception:
> > STATUS_ACCESS_VIOLATION
> > 5052 [main] foo 1007 stackdump: Dumping stack trace to
> > foo.exe.stackdump
>
> I have verified that this is a bug. Mumit Khan, the cygwin
> gcc guru, is out
> of the country and should be back mid-June. In the mean time
> I will see
> what I can find.
>
> For the time being you may work around it by replacing g++ in
> the command
> line with gcc. That produces a working executable. My best
> guess at this
> time is that there is a problem with g++ in the specs file.
> I will check it
> next.
My hunch about the specs file was wrong. There are no entries related to
g++. However I did track this down to a problem with g++ using libm.a.
When I did a:
gcc -v foo.cpp -o foo
the following was the last line of output:
/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/collect2.exe -o foo.exe
/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/../../../../i686-pc-cygwin/lib/crt0.o
-L/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2
-L/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/../../../../i686-pc-cygwin/lib
-L/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/../../.. /tmp/ccT9VBnq.o -lgcc
-lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc
And:
g++ -v foo.cpp -o foo
yields:
/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/collect2.exe -o foo.exe
/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/../../../../i686-pc-cygwin/lib/crt0.o
-L/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2
-L/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/../../../../i686-pc-cygwin/lib
-L/usr/lib/gcc-lib/i686-pc-cygwin/2.95.2/../../.. /tmp/ccjfPal7.o -lstdc++
-lm -lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc
The only significant differences here are the -lstdc++ and the -lm. This
led to following tests:
gcc -v foo.cpp -o foo -lstd++ (OKAY)
gcc -v foo.cpp -o foo -lstd++ -lm(BAD)
gcc -v foo.cpp -o foo -lm (BAD)
So the problem seems to be with libm.a.
I did a little more looking around and discovered that g++ should not be
linking against -lm. So, I came up with the following patch that at least
make g++ able to compile a working version of the trivial test listed above.
It looks like a previous patch of Mumit's may have gotten dropped.
If you cannot rebuild gcc, I can email a stripped and gzip'd version of the
fixed g++. It is only 29,995 bytes.
Wed May 31 14:52:18 CDT 2000 Ron Parker (rdparker@butlermfg.com)
* i386/cygwin.h (MATH_LIBRARY): Make it null.
More information about the Cygwin
mailing list