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

Gcc ld失败,因为libselinux对的引用未定义gettid@GLIBC_2.30,gcc,ld,glibc,undefined-reference,libselinux,Gcc,Ld,Glibc,Undefined Reference,Libselinux,我正试图从源代码构建glibc2.24。主机操作系统是WSL Ubuntu 20.04,编译器是gcc 9 尝试链接glibc的nss模块时,ld实用程序失败: /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 stat

我正试图从源代码构建glibc2.24。主机操作系统是WSL Ubuntu 20.04,编译器是gcc 9

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

/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。因此
包含一个未定义的符号
gettid@GLIBC_2.30
。我检查了
libselinux。因此
发现它确实:

$ 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

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

事实上,您发现了libc.so.6是由ld加载的,这意味着ld将使用这个库中的函数,但并不意味着它将链接到它


如果希望ld链接到此库,则必须添加
-Lpath
-lc
。但通常情况下,如果您与gcc链接,它将自动与libc链接。

您发现libc.so.6是由ld加载的,这意味着ld将使用此库中的函数,但并不意味着它将与libc链接

如果希望ld链接到此库,则必须添加
-Lpath
-lc
。但通常,如果您链接到gcc,它将自动链接到libc