[Bug 402] New: Mixing liborocos-rtt.a and .so causes crash upon exit

For more information about this bug, visit <http://www.fmtc.be/orocos-bugzilla/show_bug.cgi?id=402>
A new bug was added:

           Summary: Mixing liborocos-rtt.a and .so causes crash upon exit
           Product: RTT
           Version: rtt-trunk
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: Build System
        AssignedTo: orocos-dev@lists.mech.kuleuven.be
        ReportedBy: peter.soetens@fmtc.be

When the RTT is compiled as a static library and a dependent library (like OCL)
is compiled as a .so, an executable which uses these libraries will crash upon
exit, while the same application using all-so won't:

$ valgrind ./deployer
==25523== Memcheck, a memory error detector.
==25523== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==25523== Using LibVEX rev 1658, a library for dynamic binary translation.
==25523== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==25523== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation
framework.
==25523== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==25523== For more details, rerun with: -v
==25523==

   Switched to : Deployer
  This console reader allows you to browse and manipulate TaskContexts.
  You can type in a command, event, method, expression or change variables.
  (type 'help' for instructions)
    TAB completion and HISTORY is available ('bash' like)
 In Task Deployer. (Status of last Command : none )
 (type 'ls' for context info) :quit

==25523== Invalid read of size 4
==25523== at 0x4EDF0B9: gnu_cxx::exchange_and_add(int volatile*, int)
(in /usr/lib/libstdc++.so.6.0.8)
==25523== by 0x474B2C0: __tcf_6 (in
/home/sspr/src/Orocos/trunk/ocl/build.a/deployment/liborocos-deployment.so.0.3.0)
==25523== by 0x4F78CC8: __cxa_finalize (in /lib/tls/i686/cmov/libc-2.5.so)
==25523== by 0x46F8FF2: (within
/home/sspr/src/Orocos/trunk/ocl/build.a/deployment/liborocos-deployment.so.0.3.0)
==25523== by 0x48F354B: (within
/home/sspr/src/Orocos/trunk/ocl/build.a/deployment/liborocos-deployment.so.0.3.0)
==25523== by 0x400D9ED: (within /lib/ld-2.5.so)
==25523== by 0x4F789D8: exit (in /lib/tls/i686/cmov/libc-2.5.so)
==25523== by 0x4F61EC3: (below main) (in /lib/tls/i686/cmov/libc-2.5.so)
==25523== Address 0x5B67338 is 8 bytes inside a block of size 17 free'd
==25523== at 0x4020F51: operator delete(void*) (vg_replace_malloc.c:244)
==25523== by 0x4EC0A5C: std::string::_Rep::_M_destroy(std::allocator<char>
const&) (in /usr/lib/libstdc++.so.6.0.8)
==25523== by 0x428B933: __tcf_6 (in
/home/sspr/src/Orocos/trunk/ocl/build.a/taskbrowser/liborocos-taskbrowser.so.0.3.0)
==25523== by 0x4F78CC8: __cxa_finalize (in /lib/tls/i686/cmov/libc-2.5.so)
==25523== by 0x4262D22: (within
/home/sspr/src/Orocos/trunk/ocl/build.a/taskbrowser/liborocos-taskbrowser.so.0.3.0)
==25523== by 0x443C0AB: (within
/home/sspr/src/Orocos/trunk/ocl/build.a/taskbrowser/liborocos-taskbrowser.so.0.3.0)
==25523== by 0x400D9ED: (within /lib/ld-2.5.so)
==25523== by 0x4F789D8: exit (in /lib/tls/i686/cmov/libc-2.5.so)
==25523== by 0x4F61EC3: (below main) (in /lib/tls/i686/cmov/libc-2.5.so)
==25523==
==25523== Invalid free() / delete / delete[]
==25523== at 0x4020F51: operator delete(void*) (vg_replace_malloc.c:244)
==25523== by 0x4EC0A5C: std::string::_Rep::_M_destroy(std::allocator<char>
const&) (in /usr/lib/libstdc++.so.6.0.8)
==25523== by 0x474B2D3: __tcf_6 (in
/home/sspr/src/Orocos/trunk/ocl/build.a/deployment/liborocos-deployment.so.0.3.0)
==25523== by 0x4F78CC8: __cxa_finalize (in /lib/tls/i686/cmov/libc-2.5.so)

....

I don't know if this is a linker problem, an Orocos problem or expected
behaviour.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Ruben Smits's picture

[Bug 402] Mixing liborocos-rtt.a and .so causes crash upon exit

For more information about this bug, visit <http://www.fmtc.be/orocos-bugzilla/show_bug.cgi?id=402>
A comment was added:

------- Comment #1 from ruben.smits@mech.kuleuven.be  2007-05-14 16:14 

I've seen this kinds of problems before, at the time we began to use cmake,
components were standardly build as shared libraries resulting in the same kind
of problems when linked with a static rtt-lib.

I've no idea though what could cause the problem.

Ruben

[Bug 402] Mixing liborocos-rtt.a and .so causes crash upon exit

For more information about this bug, visit <http://www.fmtc.be/orocos-bugzilla/show_bug.cgi?id=402>
A comment was added:

------- Comment #2 from klaas.gadeyne@fmtc.be  2007-05-14 16:48 

(In reply to comment #0)
> When the RTT is compiled as a static library and a dependent library (like OCL)
> is compiled as a .so, an executable which uses these libraries will crash upon
> exit, while the same application using all-so won't:
>
> $ valgrind ./deployer

What does ldd ./deployer report exactly?

> ==25523== Invalid read of size 4
> ==25523== at 0x4EDF0B9: gnu_cxx::exchange_and_add(int volatile*, int)
> (in /usr/lib/libstdc++.so.6.0.8)
> ==25523== by 0x474B2C0: __tcf_6 (in

> I don't know if this is a linker problem, an Orocos problem or expected
> behaviour.

Does this also occur if the default libraries such as libstdc++ are linked in
statically instead?

[Bug 402] Mixing liborocos-rtt.a and .so causes crash upon exit

For more information about this bug, visit <http://www.fmtc.be/orocos-bugzilla/show_bug.cgi?id=402>
A comment was added:

------- Comment #3 from peter.soetens@fmtc.be  2007-05-15 10:10 

(In reply to comment #2)
> (In reply to comment #0)
> > When the RTT is compiled as a static library and a dependent library (like OCL)
> > is compiled as a .so, an executable which uses these libraries will crash upon
> > exit, while the same application using all-so won't:
> >
> > $ valgrind ./deployer
>
> What does ldd ./deployer report exactly?

$ ldd ./deployer

        linux-gate.so.1 =>  (0xffffe000)
        libcomedi-0.7.22.so => /usr/local/lib/libcomedi-0.7.22.so (0xb7f21000)
        liborocos-taskbrowser.so.0.3.0 =>

/home/sspr/src/Orocos/trunk/ocl/build.a/taskbrowser/liborocos-taskbrowser.so.0.3.0
(0xb7a75000)

        liborocos-deployment.so.0.3.0 =>

/home/sspr/src/Orocos/trunk/ocl/build.a/deployment/liborocos-deployment.so.0.3.0
(0xb75af000)

        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7578000)
        libxerces-c.so.27 => /usr/lib/libxerces-c.so.27 (0xb7197000)
        libncurses.so.5 => /lib/libncurses.so.5 (0xb7154000)
        libreadline.so.5 => /lib/libreadline.so.5 (0xb7122000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7038000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7011000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7005000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb6ec4000)
        /lib/ld-linux.so.2 (0xb7f2e000)
        libicuuc.so.36 => /usr/lib/libicuuc.so.36 (0xb6da4000)
        libicudata.so.36 => /usr/lib/libicudata.so.36 (0xb63f4000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb63f0000)

All libs dynamic (also OCL!) except orocos-rtt

>
> > ==25523== Invalid read of size 4
> > ==25523== at 0x4EDF0B9: gnu_cxx::exchange_and_add(int volatile*, int)
> > (in /usr/lib/libstdc++.so.6.0.8)
> > ==25523== by 0x474B2C0: __tcf_6 (in
>
> > I don't know if this is a linker problem, an Orocos problem or expected
> > behaviour.
>
> Does this also occur if the default libraries such as libstdc++ are linked in
> statically instead?

I don't think this is an issue, as when the OCL is linked statically, the
problem disappears.