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

问题描述 投票:0回答:3

我正在尝试从源代码构建 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

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

gcc ld glibc undefined-reference libselinux
3个回答
0
投票

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

如果您希望 ld 链接到此库,您必须添加

-Lpath
-lc
。但通常如果你链接到 gcc,它会自动链接到 libc。


0
投票

之间还有一个额外的

@

jonasson@linux:/usr/lib/x86_64-linux-gnu$ readelf -Ws /lib/x86_64-linux-gnu/libc.so.6 | grep gettid
  1332: 0000000000120060    12 FUNC    WEAK   DEFAULT   15 gettid@@GLIBC_2.30

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

0
投票

我遇到了同样的问题,我发现这个补丁似乎导致了这个问题,他们添加了一个

gettid

的包装
© www.soinside.com 2019 - 2024. All rights reserved.