Hi Otto and Jeremie,

I think I have the answer to your particular question, and it's
platform-independent:

Reading your log file
http://build-failures.rhaalovely.net//sparc64/2019-01-10/net/amule,-daemon.log
, there is mentioning of libestdc++ in there.

Please be aware that a program that links to both libstdc++ and
libestdc++ will likely crash, and in my experience exception handling
gone-haywire is a typical form of such a crash.

The problem lies in that one part of your program, shared libraries
included, generated an object using the C++ standard library - say an
exception - and this was passed to another part of the program, that
passed that C++ standard library version's object to another C++
standard library version, and from there things break down in undefined
ways very fast, for instance leading to sudden program termination but
no SIGSEGV.

When a library port is built with one g++ version and another library
port or your program is built with another g++ version, you run into
these troubles.

The above is my experience from combining g++ and eg++ code previously.

If you don't experience this on AMD64, it may be because all
dependencies there are compiled with llvm and therefore all depend on
one and the same libc++ only.

C++ library version incompatibilities is a really uncomfortable aspect
of the C++ ecosystem. I don't recall exactly but I think Linux has a
custom library loading logic where if there are dependencies to more
libstdc++ versions, it will only load the highest version, and not sure
but libstdc++ versions could be backwards compatible, that one would
need to be doublechecked too.

Specifically the libraries are:

OS GCC: /usr/lib/libstdc++
Ports GCC: /usr/lib/libestdc++
LLVM: /usr/lib/libc++


You check whether this is the case using ldd.

Jonathan Wakely aka redi and boru on #gcc on FreeNode IRC are big
experts.

This incomplete Gnu C++ page by Wakely discusses specific Gnu C++
standard library incompatibilities:
https://gcc.gnu.org/wiki/Cxx11AbiCompatibility

Also note LLVM's expressed design goal of "ABI compatibility with gcc's
libstdc++ for some low-level features such as exception objects, rtti
and memory allocation.", ref. https://libcxx.llvm.org .

Also note LLVM has an "--stdlib=libstdc++" to use Gnu's library instead
of its own, ref.
https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-stdlib
, and Wakely comments it here
https://stackoverflow.com/questions/19774778/when-is-it-necessary-to-use-use-the-flag-stdlib-libstdc
 .

Also there's the ABI aspect, Gnu /usr/lib/libsupc++ and LLVM
/usr/lib/libc++abi , didn't study how these play in.

Tinker

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Thursday, January 31, 2019 12:27 AM, Otto Moerbeek <o...@drijf.net> wrote:

> On Wed, Jan 30, 2019 at 01:36:17PM +0100, Otto Moerbeek wrote:
>
> > On Wed, Jan 30, 2019 at 01:21:55PM +0100, Jeremie Courreges-Anglas wrote:
> >
> > > On Wed, Jan 30 2019, Otto Moerbeek o...@drijf.net wrote:
> > >
> > > > Hi,
> > > > net/powerdns does not work well on sparc64. It is a C++ program that
> > > > uses exceptions quite extensively. The case I'm running into is a
> > > > unknown item in a config file. The code should catch the exception and
> > > > exit gracefully with an proper error message, but instead a catch-all
> > > > is being hit:
> > > > Jan 30 13:12:42 Reading random entropy from '/dev/urandom'
> > > > Jan 30 13:12:42 Loading '/usr/local/lib/pdns/libgsqlite3backend.so'
> > > > Jan 30 13:12:42 This is a standalone pdns
> > > > Jan 30 13:12:42 Listening on controlsocket in 
> > > > '/var/run/pdns.controlsocket'
> > > > terminate called after throwing an instance of 'PDNSException'
> > > > terminate called recursively
> > > > Abort trap (core dumped)
> > > > Is C++ exception handling a known broken thing on sparc64?
> > > > Any suggested remedy or should the port just be marked broken for
> > > > sparc64?
> > > > On amd64 the config file error is handled correctly.
> > >
> > > I've noticed this in the last sparc64 bulk build report:
> > > http://build-failures.rhaalovely.net//sparc64/2019-01-10/net/amule,-daemon.log
> > > I haven't looked into the details yet. It might be a fluke, or it might
> > > support your "exceptions are broken" theory.
> >
> > This is reproducable on 6.3 and 6.4, so it is not recent breakage.
> > I'll try to write a test program.
> > -Otto
>
> The test program below already shows the problem when compiled with eg++
> (and clang++ for that matter). This is using the most recent snap.
>
> The base C++ compiler does produce the correct result.
>
> $ eg++ x.cc && ./a.out
> terminate called after throwing an instance of 'ex'
> terminate called recursively
> Abort trap (core dumped)
> $ c++ x.cc && ./a.out
> Catching...
> $
>
> -Otto
>
> #include <iostream>
>
> class ex {
> };
>
> void f(void)
> {
> throw ex();
> }
>
> int main()
> {
> try {
> f();
> }
> catch (const ex & myex) {
> std::cout << "Catching..." << std::endl;
> }
> }


Reply via email to