我正在尝试从源代码构建glibc 2.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.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
我真的很困惑。为什么会出现未定义引用的问题?我该怎么解决呢?
2条答案
按热度按时间jecbmhm31#
你发现libc.so.6是由ld加载的,这意味着ld将使用这个库中的函数,但并不意味着它将链接到它。
如果你想让ld链接到这个库,你必须添加
-Lpath
和-lc
。但通常情况下,如果你与gcc链接,它会自动与libc链接。k3bvogb12#
在以下之间有一个额外的
@
: