I do not know why this occurs but it only seems to occur for libstdc++
std::ostream code.  I have had SEGFAULTs with std::cerr but not std::clog when
simply outputting errors but tried to ignore it... until I found a different
problem.  I was getting SIGABRTs from a free() assert within libc when using
std::ostringstream for simple stream operators building from static 'char const
* const' like:

std::ostringstream s;
s << "bad";

I don't have a simple test to replicate this unfortunately, but I do have an
example crash dump.  I was using the linker -rpath to always tie the executable
and the shared library to the gcc dependencies.  I have no problems with my
setup when I remove the dlopen RTLD_DEEPBIND option when loading my shared
library that includes the std::ostream usage (like that which I described for
std::ostringstream).  This particular problem is a "heisenbug" because it only
appears when I turn optimization on for the shared library (-O1 was enough to
make it crash).  The example crash dump is below:

#0  0x00002b92e27af015 in *__GI_raise (sig=<value optimized out>)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64      ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
        in ../nptl/sysdeps/unix/sysv/linux/raise.c
(gdb) back
#0  0x00002b92e27af015 in *__GI_raise (sig=<value optimized out>)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1  0x00002b92e27b0b83 in *__GI_abort () at abort.c:88
#2  0x00002b92e27f00c8 in __libc_message (do_abort=2, 
    fmt=0x2b92e28b8dd0 "*** glibc detected *** %s: %s: 0x%s ***\n")
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:170
#3  0x00002b92e27f5a58 in malloc_printerr (action=2, 
    str=0x2b92e28b63a9 "free(): invalid pointer", ptr=<value optimized out>)
    at malloc.c:5949
#4  0x00002b92e27f80a6 in *__GI___libc_free (mem=0x2b92e28aef40)
    at malloc.c:3625
#5  0x00002b92e228b0d8 in std::basic_stringbuf<char, std::char_traits<char>,
std::allocator<char> >::overflow (this=0x40a87948, __c=<value optimized out>)
    at
/.../src/lib/g++/releases/gcc-4.4.2/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:231
#6  0x00002b92e228eee5 in std::basic_streambuf<char, std::char_traits<char>
>::xsputn (this=0x40a87948, 
    __s=0xeea868
"01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
", __n=98)
    at
/.../src/lib/g++/releases/gcc-4.4.2/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/streambuf.tcc:97
#7  0x00002b92e22871d5 in std::__ostream_insert<char, std::char_traits<char> >
    (__o...@0x40a87940, __s=<value optimized out>, __n=98)
    at
/.../src/lib/g++/releases/gcc-4.4.2/x86_64-unknown-linux-gnu/libstdc++-v3/include/streambuf:427
#8  0x00002aaaaaab1998 in random_task (st...@0xeaf7a2, 
    variable0=<value optimized out>, 
    variable1=<value optimized out>, 
    variable2=<value optimized out>, 
    variable3=<value optimized out>, 
    variable4=<value optimized out>, variable5=0, 
    variable6=0, variable7=0, variable8=0, 
    variable9=0, variable10=0, variable11=0, 
    variable12=0, stre...@0x40a87cf0)
    at
/.../install/g++/releases/gcc-4.4.2_install/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.2/../../../../include/c++/4.4.2/bits/basic_string.h:2506
#9  0x00002aaaaaabd543 in do_work (stop=<value optimized out>, id=0, 
    taskda...@0xe9d8a0, taskDataSize=88, querieso...@0x40a87f70)
    at lib/cloud_job_all_patterns/src/cloud_job_random_task.cpp:106
#10 0x000000000041320d in
WorkerController::WorkerExecution::ThreadPool::ThreadFunctionObject::operator()
(this=0x40a88030, stopp...@0xeaf7a2, 
    allocator=<value optimized out>)
    at lib/cloud_worker/src/worker_execution.cpp:501
warning: (Internal error: pc 0x418d35 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x418d35 in read in psymtab, but not in symtab.)

#11 0x0000000000418d36 in
boost::detail::thread_data<WorkerController::WorkerExecution::ThreadPool::ThreadObject>::run
(this=<value optimized out>)
    at lib/cloud_worker/src/worker_execution.cpp:236
warning: (Internal error: pc 0x418d35 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0x418c80 in read in psymtab, but not in symtab.)

#12 0x00002b92e15ae350 in thread_proxy ()
   from
/.../src/lib/boost/releases/boost_1_40_0_install/lib/libboost_thread.so.1.40.0
#13 0x00002b92e2d0c3ea in start_thread (arg=<value optimized out>)
    at pthread_create.c:297
#14 0x00002b92e2862cbd in clone () from /usr/lib/debug/libc.so.6
#15 0x0000000000000000 in ?? ()


libc gives its own little backtrace:
*** glibc detected *** _release/lib/cloud-0.0.8/priv/cloud_worker_port: free():
invalid pointer: 0x00002b92e24e50a0 ***
======= Backtrace: =========
/usr/lib/debug/libc.so.6[0x2b92e27f5a58]
/usr/lib/debug/libc.so.6(cfree+0x76)[0x2b92e27f80a6]
/.../src/lib/g++/releases/gcc-4.4.2_install/lib64/libstdc++.so.6(_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi+0x168)[0x2b92e228b0d8]
/.../src/lib/g++/releases/gcc-4.4.2_install/lib64/libstdc++.so.6(_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKcl+0x35)[0x2b92e228eee5]
_release/lib/cloud-0.0.8/priv/work_types/libcloud_job_random_task.so(_Z21random_taskRKbP7pg_connRKSsS4_jjjjjjjjjjRSo+0x229)[0x2aaaaaab1998]
_release/lib/cloud-0.0.8/priv/work_types/libcloud_job_random_task.so(do_work+0x74a)[0x2aaaaaabd543]
release/lib/cloud-0.0.8/priv/cloud_worker_port[0x41320d]

You could probably replicate my scenario with the code I am using, but the
setup would be a pain (code is at
http://sourceforge.net/projects/cloudi/files/0.0.8a/cloudi-0.0.8.tar.gz/download)

Why won't std::ostream classes play well with when loaded into an executable
with RTLD_DEEPBIND?  Isn't this some sort of design problem within the
std::ostream code?


-- 
           Summary: RTLD_DEEPBIND dlopen option for shared library that uses
                    libstdc++ std::ostream crashes
           Product: gcc
           Version: 4.4.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: mjtruog at fastmail dot ca
 GCC build triplet: x86_64-unknown-linux-gnu
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: x86_64-unknown-linux-gnu


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

Reply via email to