错误信息
| Can't load 'xxx.so' for module threads: xxx.so: undefined symbol: perl_tsa_mutex_lock at xxx
|
问题介绍
在文件/usr/lib64/perl5/CORE/perl.h中有如下的定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | ##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__: