Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Cannot Reproduce
-
0.8, 0.10, 0.11, 0.14
-
None
-
None
Description
Disclaimer: I'm not a dlopen/dlclose expert... I'm perfectly happy to be told that I don't know what I'm doing!
Basic Description
If I create a shared object (that may or may not implement anything) that links with libqpidmessaging (ie g++ ... -lqpidmessaging), and then create an application that dlopen's that library, then dlclose's that library, then that application will cause a seg-fault, which appears to be in the libqpidmessaging library itself.
To demonstrate, I have a loadee.cpp file that contains just the following unimportant code:
void foo() { }
Then I build a loadee.so shared object like:
g++ -g -shared -lqpidmessaging -o loadee.so loadee.cpp
Next I have:
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> int main(int c, char *argv[]) { void *handle = dlopen("./loadee.so", RTLD_LAZY); // segfaults in dlclose below. //void *handle = dlopen("./loadee.so", RTLD_NOW); // no segfault. if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } dlclose(handle); return EXIT_SUCCESS; }
Finally I build the loader program like:
g++ -g -rdynamic -o loader loader.cpp -ldl
Now, if I run the resulting loader program, then the program seg-faults in libqpidmessaging. However, there is no such seg-fault (for me at least), if I either remove the -lqpidmessaging flag from the first g++ command, or change the flopen flags from RTLD_NOW to RTLD_LAZY (as indicated in the code comments above).
Tested Versions
I've tried this against the 0.8 and 0.10 tags, as well as trunk at r1148263, with both Autotools and CMake.
GDB
Unfortunately, gdb is not giving me much... very strange.
paul@debian:~/src/simple$ gdb ./loader GNU gdb (GDB) 7.0.1-debian Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/paul/src/simple/loader...done. (gdb) run Starting program: /home/paul/src/simple/loader [Thread debugging using libthread_db enabled] Cannot find new threads: generic error (gdb) bt Target is executing. (gdb) bt full Target is executing. (gdb) thread apply all bt Cannot find new threads: generic error (gdb)
Valgrind
Valgrind is a little more interesting though...
paul@debian:~/src/simple$ valgrind --leak-check=full --show-reachable=yes ./loader ==31992== Memcheck, a memory error detector ==31992== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==31992== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info ==31992== Command: ./loader ==31992== ==31992== Jump to the invalid address stated on the next line ==31992== at 0x0: ??? ==31992== by 0x41A1687: __cxa_finalize (cxa_finalize.c:56) ==31992== by 0x46ED0F3: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x473091F: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x401271D: _dl_close_worker (dl-close.c:271) ==31992== by 0x4013196: _dl_close (dl-close.c:742) ==31992== by 0x4034CA3: dlclose_doit (dlclose.c:37) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034CD9: dlclose (dlclose.c:48) ==31992== by 0x8048812: main (loader.cpp:12) ==31992== Address 0x0 is not stack'd, malloc'd or (recently) free'd ==31992== ==31992== ==31992== Process terminating with default action of signal 11 (SIGSEGV) ==31992== Bad permissions for mapped region at address 0x0 ==31992== at 0x0: ??? ==31992== by 0x41A1687: __cxa_finalize (cxa_finalize.c:56) ==31992== by 0x46ED0F3: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x473091F: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x401271D: _dl_close_worker (dl-close.c:271) ==31992== by 0x4013196: _dl_close (dl-close.c:742) ==31992== by 0x4034CA3: dlclose_doit (dlclose.c:37) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034CD9: dlclose (dlclose.c:48) ==31992== by 0x8048812: main (loader.cpp:12) ==31992== ==31992== HEAP SUMMARY: ==31992== in use at exit: 17,489 bytes in 85 blocks ==31992== total heap usage: 1,236 allocs, 1,151 frees, 54,608 bytes allocated ==31992== ==31992== 12 bytes in 1 blocks are still reachable in loss record 1 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x400486E: local_strdup (dl-load.c:162) ==31992== by 0x4007080: _dl_map_object (dl-load.c:2175) ==31992== by 0x4011B25: dl_open_worker (dl-open.c:225) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== by 0x80487D0: main (loader.cpp:6) ==31992== ==31992== 17 bytes in 1 blocks are possibly lost in loss record 2 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x480DBAC: global constructors keyed to Variant.cpp (Variant.cpp:174) ==31992== by 0x481A7CC: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) ==31992== by 0x480ACEF: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 18 bytes in 1 blocks are possibly lost in loss record 3 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x480DBE1: global constructors keyed to Variant.cpp (Variant.cpp:175) ==31992== by 0x481A7CC: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) ==31992== by 0x480ACEF: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 25 bytes in 1 blocks are possibly lost in loss record 4 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x471B2CC: global constructors keyed to OutgoingMessage.cpp (OutgoingMessage.cpp:44) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 25 bytes in 1 blocks are possibly lost in loss record 5 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x4716A4D: global constructors keyed to IncomingMessages.cpp (IncomingMessages.cpp:299) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 31 bytes in 1 blocks are possibly lost in loss record 6 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x471B301: global constructors keyed to OutgoingMessage.cpp (OutgoingMessage.cpp:45) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 31 bytes in 1 blocks are possibly lost in loss record 7 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x4716A82: global constructors keyed to IncomingMessages.cpp (IncomingMessages.cpp:301) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 33 bytes in 1 blocks are possibly lost in loss record 8 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x480DB77: global constructors keyed to Variant.cpp (Variant.cpp:36) ==31992== by 0x481A7CC: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) ==31992== by 0x480ACEF: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 36 bytes in 1 blocks are possibly lost in loss record 9 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x471B336: global constructors keyed to OutgoingMessage.cpp (OutgoingMessage.cpp:46) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 36 bytes in 1 blocks are possibly lost in loss record 10 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x4716AB7: global constructors keyed to IncomingMessages.cpp (IncomingMessages.cpp:302) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 41 bytes in 1 blocks are possibly lost in loss record 11 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x471B36B: global constructors keyed to OutgoingMessage.cpp (OutgoingMessage.cpp:47) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 41 bytes in 1 blocks are possibly lost in loss record 12 of 33 ==31992== at 0x402471C: operator new(unsigned int) (vg_replace_malloc.c:255) ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==31992== by 0x4716AEC: global constructors keyed to IncomingMessages.cpp (IncomingMessages.cpp:303) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 140 bytes in 1 blocks are still reachable in loss record 13 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x4023FDA: realloc (vg_replace_malloc.c:525) ==31992== by 0x400A029: _dl_new_object (dl-object.c:169) ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) ==31992== by 0x4011B25: dl_open_worker (dl-open.c:225) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== ==31992== 140 bytes in 1 blocks are still reachable in loss record 14 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x400C37E: _dl_map_object_deps (dl-deps.c:506) ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== by 0x80487D0: main (loader.cpp:6) ==31992== ==31992== 308 bytes in 7 blocks are still reachable in loss record 15 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x4009D51: _dl_lookup_symbol_x (dl-lookup.c:616) ==31992== by 0x400A845: _dl_relocate_object (dl-machine.h:344) ==31992== by 0x4011C55: dl_open_worker (dl-open.c:338) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== by 0x80487D0: main (loader.cpp:6) ==31992== ==31992== 331 bytes in 10 blocks are still reachable in loss record 16 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x400486E: local_strdup (dl-load.c:162) ==31992== by 0x40073EC: _dl_map_object (dl-load.c:2148) ==31992== by 0x400CE9B: openaux (dl-deps.c:65) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x400C191: _dl_map_object_deps (dl-deps.c:247) ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== ==31992== 331 bytes in 10 blocks are still reachable in loss record 17 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x400A113: _dl_new_object (dl-object.c:150) ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) ==31992== by 0x400CE9B: openaux (dl-deps.c:65) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x400C191: _dl_map_object_deps (dl-deps.c:247) ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 18 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x49ED792: global constructors keyed to DispatchHandle.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 19 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x4972CA0: global constructors keyed to QueueQueryBody.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 20 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x495DA00: global constructors keyed to FileRejectBody.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 21 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x493B660: global constructors keyed to ClusterConnectionTxStartBody.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 22 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x49B9380: global constructors keyed to AMQFrame.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 23 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x49947C0: global constructors keyed to FileStageBody.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 24 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x4924FF0: global constructors keyed to ClusterInitialStatusBody.cpp (iostream:72) ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 25 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x47C60D3: global constructors keyed to SessionImpl.cpp (iostream:72) ==31992== by 0x47E1C3C: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) ==31992== by 0x4781B43: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 26 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x47AE9AC: global constructors keyed to Demux.cpp (iostream:72) ==31992== by 0x47E1C3C: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) ==31992== by 0x4781B43: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 27 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x471B352: global constructors keyed to OutgoingMessage.cpp (OutgoingMessage.cpp:46) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 28 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x4705CAB: global constructors keyed to AddressResolution.cpp (AddressResolution.cpp:101) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 520 bytes in 1 blocks are still reachable in loss record 29 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) ==31992== by 0x46ED533: global constructors keyed to Address.cpp (Address.cpp:35) ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) ==31992== by 0x400DBCB: call_init (dl-init.c:70) ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== ==31992== 544 bytes in 10 blocks are still reachable in loss record 30 of 33 ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) ==31992== by 0x400C1FE: _dl_map_object_deps (dl-deps.c:470) ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== by 0x80487D0: main (loader.cpp:6) ==31992== ==31992== 628 bytes in 1 blocks are still reachable in loss record 31 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x4009E52: _dl_new_object (dl-object.c:52) ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) ==31992== by 0x4011B25: dl_open_worker (dl-open.c:225) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== by 0x80487D0: main (loader.cpp:6) ==31992== ==31992== 2,112 bytes in 11 blocks are still reachable in loss record 32 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x400F247: _dl_check_map_versions (dl-version.c:299) ==31992== by 0x4011DC8: dl_open_worker (dl-open.c:268) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) ==31992== by 0x80487D0: main (loader.cpp:6) ==31992== ==31992== 6,369 bytes in 10 blocks are still reachable in loss record 33 of 33 ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) ==31992== by 0x4009E52: _dl_new_object (dl-object.c:52) ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) ==31992== by 0x400CE9B: openaux (dl-deps.c:65) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x400C191: _dl_map_object_deps (dl-deps.c:247) ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== by 0x40115C5: _dl_open (dl-open.c:554) ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) ==31992== ==31992== LEAK SUMMARY: ==31992== definitely lost: 0 bytes in 0 blocks ==31992== indirectly lost: 0 bytes in 0 blocks ==31992== possibly lost: 334 bytes in 11 blocks ==31992== still reachable: 17,155 bytes in 74 blocks ==31992== suppressed: 0 bytes in 0 blocks ==31992== ==31992== For counts of detected and suppressed errors, rerun with: -v ==31992== ERROR SUMMARY: 12 errors from 12 contexts (suppressed: 42 from 9) Segmentation fault
Relevance
The reason I'm bothering to try to understand / fix such a scenario, is because this is precisely (or at least very close) to what happens with the PHP binding I've been working on, if the PHP processors completes very quickly (you can see some background info at https://issues.apache.org/jira/browse/QPID-3027).
Basically, the PHP plugin is compiled against libqpidmessaging, and the PHP CLI interpreter dlopen's and then dlclose's my plugin, resulting in the same segfault, at the same location (though in that case, gdb's backtrace includes info similar to Valgrind's output above (ie shows the segfault to be in __cxa_finalize, called within libqpidmessaging)).
If there is anything more I can report, or any tests / experiments worth carrying out, please let me know!
Attachments
Attachments
Issue Links
- relates to
-
QPID-3027 PHP binding of Qpid Messaging API
- Closed