在 x86 上可以跑,但是在 arm linux 上就报这个错误。
1 | /tiflash/tiflash: symbol lookup error: /tiflash/libtici_search_lib.so: undefined symbol: pthread_atfork |
首先,ldd 看到,链接的是本地的 /lib64/libpthread.so.0。
可以通过 strings /lib64/libpthread.so.0 | grep '^GLIBC_' 命令查询 GLIBC 的版本。
然后,nm 了一下 /tiflash/libtici_search_lib.so,结果是:
x86 开发机
1
2
3
4
5
6
7
8nm libtici_search_lib.so | grep pthread
0000000003c97e70 t __pthread_atfork
0000000003c97e70 t pthread_atfork
U pthread_attr_destroy
U pthread_attr_getguardsize
U pthread_attr_getstack
U pthread_attr_init
U pthread_attr_setstacksizearm tiflash:v2025.8.10-2-gc9e3144-centos7 镜像

x86 tiflash:v2025.8.10-2-gc9e3144-centos7 镜像
这个是 multi arch 镜像,但是 glibc 版本不一样
那么这个符号在 /lib64/libpthread.so.0 里面有么?nm 了一下:
- x86 的版本是 2.34,显示这个 so 是没有 Debug info 的。难道被 trim 了么?ls 了一下这个文件,发现只有 15KiB 左右。后来了解到,在较新的 GLIBC 中,pthread 相关的被整合到了 libc.so 中,我 nm 了 libc.so 确实可以看到。
- arm 版本是 2.17,nm 了可以看到其他 pthread 符号,但是看不到 pthread_atfork。

原因是在大多数 Linux 发行版(使用 glibc 的系统)中,pthread_atfork 的符号并不在常规的共享库如 libpthread.so.0 中,而是通过链接器脚本特殊处理,其具体实现位于 libpthread_nonshared.a 这个静态归档文件中,而非 .so 文件里 。
解决方案参考 https://github.com/pingcap/tiflash/pull/10571,强制使用 -pthread 而不是 -lpthread 即可。