Oceanbase:ld升级导致的error adding symbols: DSO missing from command line
问题描述:
换了一台10.11.1.192编译OB,遇到下面这个问题
make[2]: Entering directory `/home/indextest/obs/Paper_2018_longfei_shiyan/oceanbase/src/lsync'
g++ -DPACKAGE_NAME=\"OceanBase\" -DPACKAGE_TARNAME=\"oceanbase\" -DPACKAGE_VERSION=\"0.4.2.9\" -DPACKAGE_STRING=\"OceanBase\ 0.4.2.9\" -DPACKAGE_BUGREPORT=\"qushan@taobao.com\" -DPACKAGE_URL=\"http://oceanbase.taobao.org/\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DPACKAGE=\"oceanbase\" -DVERSION=\"0.4.2.9\" -DRELEASEID=\"\" -I. -I/home/indextest/lib/tb-common-utils/include/tbsys -I/home/indextest/lib/libonev/include/onev -I../../include -I../../src -D__STDC_LIMIT_MACROS -D_OB_VERSION=400 -D__STDC_CONSTANT_MACROS -D_NO_EXCEPTION -Wall -Werror -Wextra -Wunused-parameter -Wformat -Wconversion -Wno-deprecated -fno-strict-aliasing -g -Wno-ignored-qualifiers -DORDER_SERIALIZE -D__LSYNC_DEBUG__ -MT svn_version.o -MD -MP -MF .deps/svn_version.Tpo -c -o svn_version.o `test -f '../../svn_version.cpp' || echo './'`../../svn_version.cpp
mv -f .deps/svn_version.Tpo .deps/svn_version.Po
/bin/sh ../../libtool --tag=CXX --preserve-dup-deps --mode=link g++ -D__STDC_LIMIT_MACROS -D_OB_VERSION=400 -D__STDC_CONSTANT_MACROS -D_NO_EXCEPTION -Wall -Werror -Wextra -Wunused-parameter -Wformat -Wconversion -Wno-deprecated -fno-strict-aliasing -g -Wno-ignored-qualifiers -DORDER_SERIALIZE -D__LSYNC_DEBUG__ -lpthread -lc -lm -lrt -ldl -laio -lcrypt -lssl -o lsyncserver main.o ob_lsync_server_main.o ob_lsync_server_param.o ob_lsync_server.o ob_seekable_log_reader2.o ob_lsync_callback.o svn_version.o ../../src/updateserver/libupdateserver.a ../../src/rootserver/librootserver.a ../../src/mergeserver/libmergeserver.a ../../src/sstable/libsstable.a ../../src/common/libcommon.a ../../src/common/compress/libcomp.a ../../src/sql/libsql.a ../../src/common/libcommon.a ../../src/common/btree/libbtree.a /home/indextest/lib/libonev/lib/libonev.a /home/indextest/lib/tb-common-utils/lib/libtbsys.a -lcrypt
libtool: link: g++ -D__STDC_LIMIT_MACROS -D_OB_VERSION=400 -D__STDC_CONSTANT_MACROS -D_NO_EXCEPTION -Wall -Werror -Wextra -Wunused-parameter -Wformat -Wconversion -Wno-deprecated -fno-strict-aliasing -g -Wno-ignored-qualifiers -DORDER_SERIALIZE -D__LSYNC_DEBUG__ -o lsyncserver main.o ob_lsync_server_main.o ob_lsync_server_param.o ob_lsync_server.o ob_seekable_log_reader2.o ob_lsync_callback.o svn_version.o -lpthread -lc -lm -lrt -ldl -laio -lcrypt -lssl ../../src/updateserver/libupdateserver.a ../../src/rootserver/librootserver.a ../../src/mergeserver/libmergeserver.a ../../src/sstable/libsstable.a ../../src/common/libcommon.a ../../src/common/compress/libcomp.a ../../src/sql/libsql.a ../../src/common/libcommon.a ../../src/common/btree/libbtree.a /home/indextest/lib/libonev/lib/libonev.a /home/indextest/lib/tb-common-utils/lib/libtbsys.a -lcrypt
/usr/local/bin/ld: /home/indextest/lib/libonev/lib/libonev.a(onev_ssl.o): undefined reference to symbol 'ERR_get_error@@libcrypto.so.10'
/usr/lib64/libcrypto.so.10: error adding symbols: DSO missing from command line
原因:
在binutils<2.22时,ld正常完成了,bin_c对于foo的调用经由libB,传递到了libA,链接成功。
但是当binutils>=2.22时,编译出错了,ld会报上面的错,告诉你foo这个symbol解析不到,这时,我们需要编译bin_c时,显示地链接libA才可以通过。
binutils2.22开始,其中的ld开始把--no-copy-dt-needed-entries默认打开,这样一来,ld不会再自动递归地解析链接的lib,而需要由用户来一一指定。
解决方法:
在对应报错目录的Makefile.am下
AM_LDFLAGS = -lpthread -lc -lm -lrt -ldl -laio -lcrypt -lssl ${GCOV_LIB}
后加上
-Xlinker --copy-dt-needed-entries
参考:
https://segmentfault.com/a/1190000002462705
http://blog.sina.cn/dpool/blog/ArtRead.php?nid=785875540102vqtu&a_pos=1&oid=sina&vt=3&sessid=4e1ba8e24d8f882e9c257435e9d50e26
http://www.cnblogs.com/wujianlundao/archive/2012/06/06/2538125.html
http://www.cnblogs.com/OCaml/archive/2012/06/18/2554086.html