中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

找不到符号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_ITHREADSI_PTHREAD);
  • 去除预定义宏__clang__:
clang -U__clang__ ...