help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Exception-handling problem when -fno-weak is used


From: Bhaam02
Subject: Exception-handling problem when -fno-weak is used
Date: Wed, 19 Mar 2008 23:01:11 -0700 (PDT)
User-agent: G2/1.0

Hi
I'm encountering a weird problem, when I try to use -fno-weak as one
of the compiler options.
The problem which I'm encountering will be clearer from the test-
program below:

$ cat circle.h
// circle.h

class Circle{
        int radius;
        public:
        Circle(int x):radius(x){};
};

$ cat throw.cpp
#include "circle.h"

using namespace std;
void throwException()
{
        throw(Circle(10));
}
$ cat main.cpp
#include "circle.h"
#include<iostream>

using namespace std;
void throwException();

int main(int argc)
{
        try{
            throwException();
                }
        catch(Circle x)
        {
                cout<<"caught circle"<<endl;
        }
}

When I don't use -fno-weak, program works fine as expected.

$  g++ -c main.cpp;  g++ -c throw.cpp;g++ -o test throw.o main.o
$ ./test
caught circle

But when I use -fno-weak, the exception0handling fails:
$  g++ -c -fno-weak main.cpp;  g++ -c -fno-weak throw.cpp;g++ -o test
throw.o main.o
$ ./test
terminate called after throwing an instance of 'Circle'
Aborted

The preliminary examination of the problem suggests that the problem
is with the typeinfo data that C++ exception-handling uses.

For case 1:
$ nm -C test |grep typeinfo
08048c3c V typeinfo for Circle
08048c44 V typeinfo name for Circle

For case 2:
$ nm -C test |grep typeinfo
08048c3c r typeinfo for Circle
08048c5c r typeinfo for Circle
08048c44 r typeinfo name for Circle
08048c64 r typeinfo name for Circle

It appears that since two different entries are being maintained for
same type, the try-catch mechanism fails to identify the thrown type.
gcc version being used is 4.2.0; but I've also reproduced this with
gcc version 3.3.3

I surely do need to use -fno-weak.
Also it won't be possible for me to move throwException() to
main.cpp.

Is there any way out here??

Regards
Amit


reply via email to

[Prev in Thread] Current Thread [Next in Thread]