static member variable in libcommon and double free

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hey Cephers,

we are almost finished the transition to cmake. but we are also facing
some problems which did not exist in autotools.

last time i asked help on static library versus dynamic library in
this mailing list. and the consensus was we should just build and
package dynamic libraries. but this time, i ran into a more difficult
one: http://tracker.ceph.com/issues/16686.

a little bit background: we have a convenience library named libcommon
which wraps some of the class/methods shared across the Ceph project,
messenger among the other things. and in tracker#16686, i found that
in AsyncMessenger.cc, we have a static member variable named
WorkerPool::name. it is a std::string. see
https://github.com/ceph/ceph/blob/master/src/msg/async/AsyncMessenger.cc#L346

if we load both libceph.so and librados.so in the same process, when
the process exists, this variable will be destructed twice. hence the
double free. because the linker thinks that the symbols the two copies
of libcommon in libcephfs and librados are the same ones. while the
two libraries destruct the variable individually. that's why we have
this problem.

you might want to ask, "it works in autotools!". i asked myself the
same question. and i found that we don't pass
"-Wl,--exclude-libs=libcommon.a" or "-Wl,--exclude-libs,ALL" to linker
when linking libcephfs and librados, as we did in automake. this
confuses the run-time linker. yeah, we can do the same in cmake. but
this breaks the build. see
http://gitbuilder.sepia.ceph.com/gitbuilder-ceph-deb-trusty-amd64-basic/log.cgi?log=87ff7617bf2c07d43b6a6b7d116ea61f9ea6e905:

```
/srv/autobuild-ceph/gitbuilder.git/build/out~/ceph-11.0.0-902-g87ff761/src/common/Formatter.h:92:
undefined reference to `ceph::Formatter::~Formatter()'

error: collect2: ld returned 1 exit status

make[4]: *** [bin/ceph_test_rados_api_c_read_operations] Error 1
```

some librados tests (maybe more of them) are using the non-public
symbols. so we have two solutions:

- extract the .cc files which are used by these tests into a
convenience library and link the tests against it *and* librados. but
again this introduces the risk of double free. the extracted .cc files
should be non-POD static variable free.
- compile a static librados and link the tests against it. this
actually mimics the behavior of autotools. but this approach
complicates the cmake file, as we discussed before.


so, maybe we should just forbid the non-POD static variables in
libcommon? if you have  better solution, or i am completely wrong (i
wish so), please let me know.

thanks,

-- 
Regards
Kefu Chai
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux