有点郁闷,被同一个石头绊倒了二次,好记性还是不如乱笔头!事情是这样子的......
在C++的工程单测中,一般会为TESTS目标指定TESTS_ENVIRONMENT,如下:
TESTS_ENVIRONMENT = LD_LIBRARY_PATH=/usr/local/lib:/usr/lib@BITS@ HEAPCHECK=normal
TESTS = $(check_PROGRAMS)
值得注意的是,这里HEAPCHECK指定为normal,这里参考heap checker。
但发现make check时,会产生core,ldd 单测二进制,发现主要是gperftools-libs(当前版本2.7-9)中tcmalloc库(libtcmalloc.so)"污染"导致,但本身代码中没有做tcmalloc的链接。
并且发现签名相同的单测二进制,在另外一台机器上ldd则没有tcmalloc的依赖。
于是乎跟踪下去,发现brpc有tcmalloc的依赖,二台机器brpc版本和so签名全部相同,但同样在另外一台机器上ldd则没有tcmalloc的依赖。
此问题似乎难住了,ldd -u以及readelf -d都没有发现有任何异常。
继续跟踪brpc的依赖项,发现ldd /lib64/libleveldb.so.1,有依赖tcmalloc,导致堆内存检查错误。
leveldb版本是1.22-4.el8,找到对应源码,去掉tcmalloc链接即可。此处应该是EPEL官方源引入导致。
故写此文档陈述此bug。