静态链接libasan编译时出现pthread_mutex_lock多重定义错误求助
问题解决:静态链接libasan时pthread符号冲突
问题根源
你的代码手动实现了pthread_mutex_*系列函数,而静态链接的libasan中包含这些函数的拦截检测实现,链接器遇到重复的强符号定义,因此抛出多重定义错误。
可行解决方案
方法1:重定义libasan中的冲突符号(无需修改代码)
在编译命令中添加链接选项,将libasan里的冲突符号重命名,避免和你的实现冲突:
gcc12 -fsanitize=address -fsanitize=leak -static-libasan my_copy.c -o asan -lpthread -Wl,--redefine-sym=pthread_mutex_lock=asan_pthread_mutex_lock -Wl,--redefine-sym=pthread_mutex_unlock=asan_pthread_mutex_unlock -Wl,--redefine-sym=pthread_mutex_init=asan_pthread_mutex_init -Wl,--redefine-sym=pthread_mutex_destroy=asan_pthread_mutex_destroy
该选项会将libasan中的同名符号替换为自定义名称,链接器会优先使用你代码中的实现。
方法2:让ASAN跳过对这些函数的拦截
创建一个忽略规则文件(例如asan_ignore.txt),内容如下:
fun:pthread_mutex_lock fun:pthread_mutex_unlock fun:pthread_mutex_init fun:pthread_mutex_destroy
编译时指定该忽略文件,让ASAN不生成这些函数的拦截版本:
gcc12 -fsanitize=address -fsanitize=leak -static-libasan -fsanitize-ignorelist=asan_ignore.txt my_copy.c -o asan -lpthread
方法3:标记自定义实现为弱符号(需修改代码)
如果允许修改遗留代码,可给你的pthread_mutex_*函数添加__attribute__((weak))属性,但此方法会让链接器优先使用libasan的实现,仅当你不需要自己的实现生效时适用:
__attribute__((weak)) int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) { (void)mutex; (void)attr; return 0; } // 其余pthread_mutex_*函数同理添加该属性
内容的提问来源于stack exchange,提问作者Nabz C
相关产品推荐
相关产品推荐

