Hi,
I have a project that runs on Ubuntu 16.04 64bit and uses libunwind as a
transitive dependency (it's required by google glog, and zeromq). The
problem is that the signal mask of the the application gets trashed with a
random mask each time a C++ exception is thrown and caught, (I suspect)
caused by libunwind. The following code reliably reproduces the problem on
my system:

#include <iostream>
#include "signal.h"
#include "string.h"

int main()
{
    // no signals masked at startup
    try {
        throw std::runtime_error("rsgfdg");
    } catch (const std::exception& e) {
        std::cout << e.what() << std::endl;
    }

    // signal mask altered at this point, log it
  std::cout << "Masked signals:" << std::endl;

    sigset_t oldset;
    sigprocmask(SIG_SETMASK, nullptr, &oldset);

    for (int i = 1; i < NSIG; i++)
        if (sigismember(&oldset, i))
            std::cout << i << " " << strsignal(i) << std::endl;

    return 0;
}

Compiling and linking:
/usr/bin/c++ -g -std=c++14 -Werror -Wall -Wextra -o testMain.cpp.o -c
testMain.cpp
/usr/bin/c++ -g testMain.cpp.o  -o test_app -rdynamic -lunwind

When I run the test app it always outputs some signals masked. With
valgrind I get this output (among other uninitialized read errors in
unwind.so):
==9355== Syscall param rt_sigprocmask(set) points to uninitialised byte(s)
==9355==    at 0x4E3DEF6: _Ux86_64_setcontext (in
/usr/lib/x86_64-linux-gnu/libunwind.so.8.0.1)
==9355==  Address 0xffefff418 is on thread 1's stack

My hypothesis is that the unwind implementation in libunwind.so and
libgcc_s.so get mixed up:
 - all _Unwind_* functions are provided by libgcc_s (transitively via
__cxa_throw and co.) except for _Unwind_Resume
 - _Unwind_Resume is the only 'U' type symbol in my executable (listed with
nm) gets resolved from libunwind.so

Unfortunately I don't know how to dump the full PLT once resolved by the
runtime linker, but putting -lgcc_s on the linker command line before
unwind solves my issue.

My first question: is my hypotesis correct or plausible? If so, how am I
supposed link against libunwind to avoid such issues? I consider the
explicitly putting libgcc_s on the link list a workaround...

What's also strange that I didn't find anything about it in the libunwind
docs (or the web), but usually when 2 independent libraries provide the
same API that's something worth mentioning. The only similar thing I found
the web is a forked libunwind repo explicitly commenting out calls to
rt_sigprocmask, here:
https://lab.nexedi.com/Daetalus/Pyston/commit/1bac7510861a112a9023f821bf3e857a6fb45037#diff-4

Can you help me clarify this?

Regards,
Gyorgy Szekely
_______________________________________________
Libunwind-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/libunwind-devel

Reply via email to