对官方tensorflow-1.15.5做了移除abseil-cpp之后,发现一些link问题,程序虽然编译和链接时,都没有问题,但是打的RPM包之后,程序运行时,会hang住。
本地正常运行也没有问题,主要体现在最后link的参数上:
-Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
如果一旦链接上-specs=/usr/lib/rpm/redhat/redhat-hardened-ld,就表现不正常,此问题已经在红帽子官网报告过。当前笔者使用的是CentOS8,和fedora23相当,所以此处bug仅记录。
解决办法也比较简单,spec文件中加入自定义ldflags即可:
%define build_ldflags %{nil}
这里为不加。
本着寻根究底的精神,确认link过程中有问题,于是,查询去掉一部分link,发现并不会hang住,罪魁祸首是opennmt-tokenizer,其依赖了sentencepiece,而sentencepiece代码中依赖了protobuf和absl,在0.1.96版本中,由于SPM_USE_EXTERNAL_ABSL写反了(BUG),导致使用了thirdparty目录下的protobuf的源文件和abseil的源文件加入其中一起编译,从而导致了符号冲突。
BTW:二进制运行时提示:
[libprotobuf ERROR google/protobuf/descriptor_database.cc:641] File already exists in database: tensorflow/core/profiler/tfprof_log.proto
有几种情况:
(1)tensorflow的C库和C++库一起链接导致;
(2)其它protobuf的版本内置导致,如(abseil)