Open MingcongBai opened 9 months ago
目前来看的情况是:打包的共享库文件 libutforpc.so
的 .dynamic
节中,缺少需要的库的声明(DT_NEEDED
),该库文件至少还需要 libssl.so.1.1
和 libldap-2.4.so.2
;同时,在 .dynsym
节中,对 openssl 的符号的引用没有标注符号版本。上述问题可能致使 libutforpc.so
被连接上错误的 openssl 的符号版本。
结合上述现象,合理推测在连接 libutforpc.so
时,没有传入 -Wl,-z,defs
选项,同时没有指明其全部的直接依赖库,致使出现了未能连接的符号进入目标产物。同时,由于运行的系统上目前暂时不存在更新的 openssl 库,并且上述两个缺失的依赖库刚好作为其他共享库文件的依赖引入,于是掩盖了上述问题,看起来可以成功运行。
建议:在连接共享库文件的时候,应传入 -Wl,-z,defs
选项,并传入全部直接依赖(例如 -lssl
)。前者可以当传入的依赖不完整的时候报错退出,后者可以在连接的目标产物中增加需要库的声明,并正确设定符号版本。
据 @shankerwangmiao 报告,钉钉内置的
libutforpc.so
,其中定义了一些SSL_*
符号,如图:初步调查的结论是:估计编译的时候没有加
-Wl,-z,defs
参数,然后又没有加-lssl
,所以没定义的SSL_
符号便没有正确定义,而且符号表里没有SSL_
相关符号的版本。这个库用到的 ssl 函数符号,有的是 OpenSSL 3.x 的,有的是 OpenSSL 1.1 的,程序便无法运行了。需要强调的是,该问题是 libLoL 测试过程中发现的,和 libLoL 提供的环境无关,反而是暴露了钉钉语音发行内容中存在的问题;换言之,假若是旧世界系统升级了 OpenSSL 3.x,钉钉也会挂掉;目前只是刚好能运行而已。