delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2005/01/12/07:02:04

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-ID: <32235.193.16.155.145.1105531282.squirrel@193.16.155.145>
Date: Wed, 12 Jan 2005 13:01:22 +0100 (CET)
Subject: c++ exceptions in shared library results in crash
From: "Rainer Hochreiter" <rainer AT hochreiter DOT at>
To: cygwin AT cygwin DOT com
Cc: crossgcc AT sources DOT redhat DOT com
User-Agent: SquirrelMail/1.4.3a-0.f0.9.1.legacy
MIME-Version: 1.0
X-IsSubscribed: yes
Note-from-DJ: This may be spam

------=_20050112130122_33144
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

first of all, i want to apologize for cross-posing, but i think this
question is of interest for both lists.

now my problem:
i created a main program and a shared library, both written in c++, where
the source is parially taken from the "c++ dlopen mini howto".

find the sources in the attachments!

throwing an exception in the shared library results in a core dump of the
binary executable - but only for the cross-compiled version!

the native linux and cygwin compiled versions work.
so, could someone give me a hint, what's wrong with my cross-compiler?

my cross-compiler (verson 3.2.3) runs under linux and creates cygwin
executables.

thnx!

-- 
rainer hochreiter             | web:    www.hochreiter.at
lilienfelder str. 43          | e-mail: rainer AT hochreiter DOT at
a-3150 wilhelmsburg / austria | mobile: +43 664 2812175
------=_20050112130122_33144
Content-Type: application/octet-stream; name="configure.ac"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="configure.ac"

QUNfSU5JVChtYWluLmNwcCkKQUNfUFJFUkVRKDIuNTIpCkFNX0lOSVRfQVVU
T01BS0UoZGxsY3BwLCAwLjEuMCkKCkFDX0NBTk9OSUNBTF9CVUlMRApBQ19D
QU5PTklDQUxfSE9TVAoKQ1lHV0lOX1JPT1RfRElSPSIvb3B0L2N5Z3dpbi1j
cm9zcy1nY2MiCkNZR1dJTl9CSU5fRElSPSIkQ1lHV0lOX1JPT1RfRElSL2Jp
biIKQ1lHV0lOX0lOQ19ESVI9IiRDWUdXSU5fUk9PVF9ESVIvaTY4Ni1wYy1j
eWd3aW4vaW5jbHVkZSIKQ1lHV0lOX0xJQl9ESVI9IiRDWUdXSU5fUk9PVF9E
SVIvaTY4Ni1wYy1jeWd3aW4vbGliIgpBQ19TVUJTVChDWUdXSU5fQklOX0RJ
UikKQUNfU1VCU1QoQ1lHV0lOX0lOQ19ESVIpCkFDX1NVQlNUKENZR1dJTl9M
SUJfRElSKQoKQ0M9IiRDWUdXSU5fQklOX0RJUi9pNjg2LXBjLWN5Z3dpbi1n
Y2MiCkNYWD0iJENZR1dJTl9CSU5fRElSL2k2ODYtcGMtY3lnd2luLWcrKyIK
QVI9IiRDWUdXSU5fQklOX0RJUi9pNjg2LXBjLWN5Z3dpbi1hciIKTk09IiRD
WUdXSU5fQklOX0RJUi9pNjg2LXBjLWN5Z3dpbi1ubSIKUkFOTElCPSIkQ1lH
V0lOX0JJTl9ESVIvaTY4Ni1wYy1jeWd3aW4tcmFubGliIgpTVFJJUD0iJENZ
R1dJTl9CSU5fRElSL2k2ODYtcGMtY3lnd2luLXN0cmlwIgpETExUT09MPSIk
Q1lHV0lOX0JJTl9ESVIvaTY4Ni1wYy1jeWd3aW4tZGxsdG9vbCIKT0JKRFVN
UD0iJENZR1dJTl9CSU5fRElSL2k2ODYtcGMtY3lnd2luLW9iamR1bXAiCkFT
PSIkQ1lHV0lOX0JJTl9ESVIvaTY4Ni1wYy1jeWd3aW4tYXMiCkFDX1BBVEhf
UFJPRyhDUFAsIGNwcCwgJENZR1dJTl9CSU5fRElSL2k2ODYtcGMtY3lnd2lu
LWNwcCwgJENZR1dJTl9CSU5fRElSKQoKQUNfUFJPR19SQU5MSUIKQUNfUFJP
R19DQwpBQ19QUk9HX0NYWApBQ19QUk9HX0NQUAoKQUNfTElCVE9PTF9ETE9Q
RU4KQUNfUFJPR19MSUJUT09MCkFDX1NVQlNUKExJQlRPT0xfREVQUykKCkFD
X0hFQURFUl9TVERDCkFDX09VVFBVVChbTWFrZWZpbGVdKQo=

------=_20050112130122_33144
Content-Type: application/octet-stream; name="Makefile.am"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Makefile.am"

bm9pbnN0X0xUTElCUkFSSUVTCT0gbGliZXhjZXB0aW9uLmxhCmxpYmV4Y2Vw
dGlvbl9sYV9TT1VSQ0VTCT0gZXhjZXB0aW9uLmNwcApsaWJleGNlcHRpb25f
bGFfTERGTEFHUwk9IAoKbGliX0xUTElCUkFSSUVTCQk9IGxpYmNwcGRsbC5s
YQpsaWJjcHBkbGxfbGFfU09VUkNFUwk9IHRyaWFuZ2xlLmNwcApsaWJjcHBk
bGxfbGFfTERGTEFHUwk9IC12ZXJzaW9uLWluZm8gMTowOjEgLW5vLXVuZGVm
aW5lZApsaWJjcHBkbGxfbGFfTElCQURECT0gbGliZXhjZXB0aW9uLmxhCgpi
aW5fUFJPR1JBTVMJCT0gdXNlZGxsCnVzZWRsbF9TT1VSQ0VTCQk9IG1haW4u
Y3BwCnVzZWRsbF9MREFERAkJPSBsaWJleGNlcHRpb24ubGEK

------=_20050112130122_33144
Content-Type: text/x-c++; name="exception.cpp"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="exception.cpp"

#include "exception.hpp"
#include <iostream>

using std::cout;
using std::cerr;
using std::endl;

MyException::MyException(const std::string& reason) throw()
	: reason_(reason) 
{ 
	cout << "create MyException with reason: " << reason_ << endl;
} 

MyException::~MyException() throw() { }

const char* MyException::what() const throw() { 
	return reason_.c_str();
}
------=_20050112130122_33144
Content-Type: text/x-c-header; name="exception.hpp"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="exception.hpp"

#ifndef __CLASS_EXCEPTION_HPP__
#define __CLASS_EXCEPTION_HPP__

#include <string>
#include <stdexcept>

class MyException : public std::exception {
public:
	MyException(const std::string& reason) throw();

	virtual ~MyException() throw();

	virtual const char* what() const throw();

private:
	const std::string reason_;
};

#endif // __CLASS_EXCEPTION_HPP__
------=_20050112130122_33144
Content-Type: text/x-c++; name="main.cpp"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="main.cpp"

#include "polygon.hpp"
#include "exception.hpp"
#include <dlfcn.h>
#include <iostream>

using std::cout;
using std::cerr;
using std::endl;

int main () {

	cout << "C++ dlopen demo" << endl << endl;

	try {
		// load the library
#if defined(__CYGWIN__)
		const std::string libname("cygcppdll-0.dll");
#else
		const std::string libname("libcppdll.so");
#endif
		cout << "Opening library " << libname << "..." << endl;
		void* handle = dlopen(libname.c_str(), RTLD_LAZY);
		if(handle == 0) {
			cout << "dlopen() failed: " << dlerror() << endl;
			return 1;
		}

		// load the symbols
		cout << "Load symbols from library..." << endl;
		create_t* create_triangle = (create_t*) dlsym(handle, "create");
		destroy_t* destroy_triangle = (destroy_t*) dlsym(handle, "destroy");
		if(create_triangle == 0 || destroy_triangle == 0) {
			cout << "dlsym() failed: " << dlerror() << endl;
			return 1;
		}

		// create instance of class
		cout << "Create class instance..." << endl;
		polygon* poly = create_triangle();

		// use class
		cout << "Use class..." << endl;
		poly->set_side_len(7);
		cout << "poly area is " << poly->area() << endl;

		cout << "Create exception in class..." << endl;
		poly->crash("throw exception");


		// destroy class
		cout << "Destroy class..." << endl;
		destroy_triangle(poly);

		// close library
		cout << "Close library..." << endl;
		dlclose(handle);
		return 0;
	} catch (const MyException& e) {
		cout << "Caught MpException: " << e.what() << endl;
		return 1;
	} catch (const std::exception& e) {
		cout << "Caught std::exception: " << e.what() << endl;
		return 1;
	} catch (...) {
		cout << "Caught unknown exception" << endl;
		return 1;
	}
}				
------=_20050112130122_33144
Content-Type: text/x-c-header; name="polygon.hpp"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="polygon.hpp"

#ifndef __CLASS_POLYGON_HPP__
#define __CLASS_POLYGON_HPP__

#include <string>

class polygon {
public:
	polygon() : side_length_(0) { }

	void set_side_len(double side_length) {
		side_length_ = side_length;
	}

	virtual double area() const = 0;

	virtual double crash(const std::string& reason) const = 0;

protected:
	double side_length_;

private:
};

typedef polygon* create_t();
typedef void destroy_t(polygon*);

#endif // __CLASS_POLYGON_HPP__
------=_20050112130122_33144
Content-Type: text/x-c++; name="triangle.cpp"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment; filename="triangle.cpp"

#include "exception.hpp"
#include "polygon.hpp"
#include <cmath>
#include <iostream>

using std::cout;
using std::cerr;
using std::endl;

class triangle : public polygon {
public:
	virtual double area() const {
		cout << "area()..." << endl;
		return side_length_ * side_length_ * sqrt(3) / 2;
		cout << "area()...done." << endl;
	}

	virtual double crash(const std::string& reason) const {
		cout << "crash()...." << endl;
		throw MyException(reason);
		// NEVER REACH THIS
		cout << "crash()...done." << endl;
	}
};


// class factories
extern "C" polygon* create() {
	return new triangle;
}

extern "C" void destroy(polygon* p) {
	delete p;
}

------=_20050112130122_33144
Content-Type: text/plain; charset=us-ascii

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/
------=_20050112130122_33144--


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019