undefined symbol pthread_atfork

在 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,结果是:

  1. x86 开发机

    1
    2
    3
    4
    5
    6
    7
    8
    nm 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_setstacksize
  2. arm tiflash:v2025.8.10-2-gc9e3144-centos7 镜像

  3. 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 即可。