ld失败,因为libselinux具有对gettid@GLIBC_2.30的未定义引用

问题描述

我正在尝试从源代码构建glibc 2.24。主机操作系统是WSL Ubuntu 20.04,编译器是gcc 9。

尝试链接glibc的ld模块时,nss实用程序失败:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libselinux.so: undefined reference to `gettid@GLIBC_2.30'
collect2: error: ld returned 1 exit status

似乎libselinux.so包含未定义的符号gettid@GLIBC_2.30。我检查了libselinux.so,发现它确实存在:

$ readelf -Ws /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libselinux.so | grep gettid
    13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND gettid@GLIBC_2.30 (4)

由于libselinux.so已加载ld,因此我进一步检查了ld的依赖性:

$ ldd /usr/bin/ld
        linux-vdso.so.1 (0x00007fffd365c000)
        libbfd-2.34-system.so => /lib/x86_64-linux-gnu/libbfd-2.34-system.so (0x00007f144c410000)
        libctf.so.0 => /lib/x86_64-linux-gnu/libctf.so.0 (0x00007f144c3f0000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f144c3e0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f144c1e0000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f144c1c0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f144c713000)

我发现加载libc.so.6时将加载ld。但是,当我进一步检查libc.so.6中定义的符号时,发现gettid@GLIBC_2.30已经被定义:

$ readelf -Ws /lib/x86_64-linux-gnu/libc.so.6 | grep gettid
  1329: 00000000001231c0    12 FUNC    WEAK   DEFAULT   16 gettid@@GLIBC_2.30

我真的很困惑。为什么会出现未定义的引用问题?那我该怎么解决呢?

解决方法

您发现ld加载了libc.so.6的事实意味着ld将使用该库中的函数,但并不意味着它会与其链接。

如果您希望ld再次链接到该库,则必须添加-Lpath-lc。但是通常,如果您与gcc链接,它将自动针对libc链接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...