找不到符号perl_tsa_mutex_lock
错误信息
Can't load 'xxx.so' for module threads: xxx.so: undefined symbol: perl_tsa_mutex_lock at xxx
问题介绍
在文件/usr/lib64/perl5/CORE/perl.h中有如下的定义:
##if ... defined(__clang__) ... ## define PERL_TSA__(x) __attribute__((x)) ## define PERL_TSA_ACTIVE ##else ## define PERL_TSA__(x) /* No TSA, make TSA attributes no-ops. */ ## undef PERL_TSA_ACTIVE ##endif ##ifdef PERL_TSA_ACTIVE EXTERN_C int perl_tsa_mutex_lock(perl_mutex* mutex) PERL_TSA_ACQUIRE(*mutex) PERL_TSA_NO_TSA; EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex) PERL_TSA_RELEASE(*mutex) PERL_TSA_NO_TSA; ##endif##endif
由于针对Clang使用的mutex相关的符号是有线程安全标记的perl_tsa_*,但是libperl.so并不包含这些符号,故而出现链接错误。
解决方案
- 使用包含perl_tsa_*符号的libperl.so(在编译libperl.so时,加上宏USE_ITHREADS和I_PTHREAD);
- 去除预定义宏__clang__:
clang -U__clang__ ...
父主题: 其它类兼容问题