public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/17721] New: exception not caught in shared lib if using dlopen
@ 2004-09-29 11:08 frank dot schaedlich at asg dot com
  2004-09-29 11:55 ` [Bug c++/17721] " pinskia at gcc dot gnu dot org
  0 siblings, 1 reply; 2+ messages in thread
From: frank dot schaedlich at asg dot com @ 2004-09-29 11:08 UTC (permalink / raw)
  To: gcc-bugs

I have a function f() which throws
an exception of the type Exception:

class Exception {
};

extern "C" void f() {
    throw Exception();
}

The exception should be catched with

try { f(); } 
catch (Exception& e) .

This works not if f() is placed in 
a shared library and the library was
loaded with dlopen(). If the type of the 
exception is a class then this type 
seems to be missing and it can't be determind 
which handler can catch the exception. Only 
catch (...) works. Other types, e. g. int,
works fine.

The bug occurs on (1) Linux / gcc 3.4.0,
(2) Linux gcc 3.3.2 but not on (3) Solaris /
gcc 3.3.2.

(1)  

>Release:       3.4.0
>Environment:
System: Linux mars 2.4.21-99-smp #1 SMP Wed Sep 24 13:31:14 UTC 2003 i686 i686
i386 GNU/Linux
Architecture: i686

        <machine, os, target, libraries (multiple lines)>
host: i586-suse-linux-gnu
build: i586-suse-linux-gnu
target: i586-suse-linux-gnu
configured with: /tmp/1/GCC340/gcc-3.4.0/configure --enable-threads=posix
--prefix=/usr/gcc340 --enable-languages=c,c++,f77,objc,java,ada
--disable-checking --enable-libgcj --with-system-zlib --enable-shared
--enable-__cxa_atexit i586-suse-linux

(2)

>Release:       3.3.2
>Environment:
System: Linux mars 2.4.21-99-smp #1 SMP Wed Sep 24 13:31:14 UTC 2003 i686 i686
i386 GNU/Linux
Architecture: i686

        <machine, os, target, libraries (multiple lines)>
host: i586-suse-linux-gnu
build: i586-suse-linux-gnu
target: i586-suse-linux-gnu
configured with: /tmp/1/GCC332/gcc-3.3.2/configure --enable-threads=posix
--prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info
--mandir=/usr/share/man --libdir=/usr/lib
--enable-languages=c,c++,f77,objc,java,ada --disable-checking --enable-libgcj
--with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib
--enable-shared --enable-__cxa_atexit i586-suse-linux

(3)

>Release:       3.2.3
>Environment:
System: SunOS oberon 5.7 Generic_106541-34 sun4u sparc SUNW,UltraSPARC-IIi-Engin
e
Architecture: sun4

        <machine, os, target, libraries (multiple lines)>
host: sparc-sun-solaris2.7
build: sparc-sun-solaris2.7
target: sparc-sun-solaris2.7
configured with: ../gcc-3.2.3/configure --prefix=/usr/local --enable-languages=c
,c++

Here is a small testcase:

$ cat exception.h 

#ifndef _exception_h_
#define _exception_h_

class Exception {
};

#endif

$ cat libf1.cpp 

#include "exception.h"

extern "C" void f1() {
    throw Exception();
}

$ cat test_exception.cpp

#include <iostream>
#include <dlfcn.h>
#include "exception.h"
using namespace std;


void f0 () {
   throw Exception() ;
}

main() {

    try {
            f0();
    } catch (Exception& e) {
            cerr << "f0: Exception. " << endl;
    } catch (...) {
            cerr << "f0: unknown exception - expected: Exception. " << endl;
    }


    void *lib_f1;
    void (*f1_call)();

    if (!(lib_f1=dlopen("./libf1.so",RTLD_LAZY))) {
            cerr << endl;
            cerr << "Can't open ./libf1.so." << endl;
            cerr << endl;
            exit(1);
    }

    if (!(f1_call=(void (*)())dlsym(lib_f1,"f1"))) {
            cerr << endl;
            cerr << "Can't bind f1." << endl;
            cerr << endl;
            exit(2);
    }

    try {
            (*f1_call)();
    } catch (Exception& e) {
            cerr << "f1: Exception. " << endl;
    } catch (...) {
            cerr << "f1: unknown exception - expected: Exception. " << endl;
    }

    dlclose(lib_f1);
}

$ cat Makefile

CC = g++

all: test_exception libf1.so

test_exception: test_exception.cpp exception.h
        $(CC) -ldl -o test_exception test_exception.cpp

libf1.so: libf1.cpp exception.h
        $(CC) -fPIC -shared -Wl,-soname,libf1.so -o libf1.so libf1.cpp
        #$(CC) -fPIC -G -o libf1.so libf1.cpp

clean:
        rm -f *.o libf?.so core* a.out test_exception

-- 
           Summary: exception not caught in shared lib if using dlopen
           Product: gcc
           Version: 3.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: frank dot schaedlich at asg dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i586-suse-linux-gnu
  GCC host triplet: i586-suse-linux-gnu
GCC target triplet: i586-suse-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17721


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

* [Bug c++/17721] exception not caught in shared lib if using dlopen
  2004-09-29 11:08 [Bug c++/17721] New: exception not caught in shared lib if using dlopen frank dot schaedlich at asg dot com
@ 2004-09-29 11:55 ` pinskia at gcc dot gnu dot org
  0 siblings, 0 replies; 2+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-09-29 11:55 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From pinskia at gcc dot gnu dot org  2004-09-29 11:55 -------


*** This bug has been marked as a duplicate of 3993 ***

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |DUPLICATE


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17721


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

end of thread, other threads:[~2004-09-29 11:55 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-09-29 11:08 [Bug c++/17721] New: exception not caught in shared lib if using dlopen frank dot schaedlich at asg dot com
2004-09-29 11:55 ` [Bug c++/17721] " pinskia at gcc dot gnu dot org

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).