467,888 Members | 1,378 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 467,888 developers. It's quick & easy.

Statically linked library causes segmentation violation upon C++ throw

I statically link the Synopsys Milkyway C-API library ("MDA") into my
C++ application. When my C++ application throws an exception, it seg
faults instead.

The details of my environment are:
x86 (Pentium) CPU or AMD x86_64 (Opteron)
Red Hat Enterprise Linux 3 OS
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-54)
Also reproduced with gcc version 3.3.2

The Synopsys Milkyway C-API library is,
Static linked library (dynamic linked not available)
Developed in C, not C++
supported on Red Hat Enterprise Linux 3.0, gcc version 3.3.2

The problem is platform-dependent:

- The problem occurs when I compile for 32 bits and link to the x86
MDA library, and run on either x86 and AMD x86_64 (Opteron)

- No problem when I compile for 64 bits and link to the x86_64 MDA,
and run on AMD x86_64

- No problem in the absence of IA32 MDE

In summary, there is something wrong with the 32 bit x86 version of MDA
library, regardless of whether it is run on an x86 machine or an AMD
x86_64 machine. But how to fix it?

The attached test program executes the MDA initialization function
MWXDb_omwxInit(), and then throws an exception. This causes the seg
fault as described above. When I comment out MWXDb_omwxInit(), throw
works as expected.

---------
#include <cstdio>
#include <cstdlib>
#include "omwx_proto.h" // Include file for MDA

void
thrower(const int in)
{
if (in > 1) {
printf("Throw an exception.\n");
throw 3;
}
printf("Did not throw an exception.\n");
}

int
main(int argc,
char **argv)
{
// When present, causes the mda lib to be included,
// and the throw to fail with a segv.
// When commented out, the throw works fine.
MWXDb_omwxInit(argc, argv, 1);

try {
thrower(argc);

} catch(int &excp) {
printf("Caught exception %d.\n", excp);
}
}

Jun 3 '06 #1
  • viewed: 2230
Share:
2 Replies
go****@voom.net wrote:
I statically link the Synopsys Milkyway C-API library ("MDA") into my
C++ application. When my C++ application throws an exception, it seg
faults instead.

The details of my environment are:
x86 (Pentium) CPU or AMD x86_64 (Opteron)
Red Hat Enterprise Linux 3 OS
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-54)
Also reproduced with gcc version 3.3.2

The Synopsys Milkyway C-API library is,
Static linked library (dynamic linked not available)
Developed in C, not C++
supported on Red Hat Enterprise Linux 3.0, gcc version 3.3.2

The problem is platform-dependent:

- The problem occurs when I compile for 32 bits and link to the x86
MDA library, and run on either x86 and AMD x86_64 (Opteron)

- No problem when I compile for 64 bits and link to the x86_64 MDA,
and run on AMD x86_64

- No problem in the absence of IA32 MDE

In summary, there is something wrong with the 32 bit x86 version of MDA
library, regardless of whether it is run on an x86 machine or an AMD
x86_64 machine. But how to fix it?

The attached test program executes the MDA initialization function
MWXDb_omwxInit(), and then throws an exception. This causes the seg
fault as described above. When I comment out MWXDb_omwxInit(), throw
works as expected.

---------
#include <cstdio>
#include <cstdlib>
#include "omwx_proto.h" // Include file for MDA

void
thrower(const int in)
{
if (in > 1) {
printf("Throw an exception.\n");
throw 3;
}
printf("Did not throw an exception.\n");
}

int
main(int argc,
char **argv)
{
// When present, causes the mda lib to be included,
// and the throw to fail with a segv.
// When commented out, the throw works fine.
MWXDb_omwxInit(argc, argv, 1);

try {
thrower(argc);

} catch(int &excp) {
printf("Caught exception %d.\n", excp);
}
}


#include <iostream>
#include <ostream>
#include "omwx_proto.h" // Include file for MDA

int main(int argc, char **argv)
{
try
{
thrower(argc);
MWXDb_omwxInit(argc, argv, 1);
// do stuff
// release
}
catch(int& e const)
{
std::cout << "error: " << e << std::endl;
}
}
Jun 3 '06 #2
The following is not the solution to *my particular problem* with the
Synopsys Milkyway C-API. However, to make this a more useful thread
for others, I will add some more information that I found. Perhaps
this might even jog someone's memory wrt my problem.

I discovered that this same problem has occured in other software, like
MySQL, syslog(), libjpeg, and boost::python.

I suspected gcc bug 16698:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16698
This bug was not in gcc 2.95.3, but did appear in 3.0.4, 3.2.3, 3.3.3,
3.4.0, and 4.0.0. It is fixed in gcc 3.4.2. Perhaps if the Milkyway
C-API 2004.06 was compiled with gcc 2.95, and the troublesome 2005.09
was compiled with gcc 3.3.2?

Alas, both versions of the Synopsys Milkyway C-API were compiled with
gcc 3.2.2 and 3.3.2. If my problem was due to gcc bug 16698, I would
have seen it in both versions of the Synopsys Milkyway C-API, or in
neither version.

Here are some more references. There is also some talk a problem with
ABI (Application Binary Interface).

Same problem, but with syslog():
http://gcc.gnu.org/ml/gcc-help/2004-04/msg00069.html

Same problem, but with libjpeg:
https://bugzilla.redhat.com/bugzilla....cgi?id=101448
"simple fix is to rebuild libjpeg as C++":
http://dburns.dhs.org/osgarchiver/ar...2003/0000.html

Same problem, but with boost::python:
http://mail.python.org/pipermail/c++...ne/004246.html

More information on ABI:
http://www.usenix.org/publications/l...owndavid_html/

John McGehee, Voom, Inc.

Jun 9 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Kevin Crosbie | last post: by
57 posts views Thread by Xarky | last post: by
reply views Thread by Frank Duan via .NET 247 | last post: by
6 posts views Thread by DanielJohnson | last post: by
36 posts views Thread by Martin Larsen | last post: by
reply views Thread by MrMoon | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.